Android中ViewFlipper的使用及设置动画效果实例详解

本文实例讲述了Android中ViewFlipper的使用及设置动画效果。分享给大家供大家参考,具体如下:

说到左右滑动,其实实现左右滑动的方式很多,有ViewPaer,自定义实现Viewgroup,gallery等都可以达到这种效果。这里做下ViewFliper实现左右滑动的效果。
会用到以下的技术:

1、ViewFlipper
2、GestureDetector
3、Animation

主要是这三个类在起作用。

ViewFlipper,不妨把它看做一个容器吧,你可以把许多的View放在这个容器中,让它展示给用户,虽然它每次只展示一个view,我感觉它的用途更好是作为广告展示,比如类似购物网站那样的广告滚动展示。比如可以设置自动播放功能,就可以滚动广告了!

原理:向左向右滑动主要是依赖手势来控制,手势向右滑动就调用 viewFlipper.showNext()方法,同理,向左滑动就会去调用viewFlipper.showPrevious()方法。

效果图如下:

接下来直接上代码:

首先在布局文件中添加ViewFlipper的标签:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:background="@drawable/pattern1" >
  <Button
    android:id="@+id/treasure_chest_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:background="@drawable/treasure" />
  <ViewFlipper
    android:id="@+id/viewflipper"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/treasure_chest_btn" >
  </ViewFlipper>
  <Button
    android:id="@+id/garbage_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@id/viewflipper"
    android:background="@drawable/garbage" />
</RelativeLayout>

其次是在anim中定义动画:

slide_left_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
  <!--
   画面转换位置移动动画效果
   开始向左动画
   fromXDelta : 动画开始时 X坐标位置
   toXDelta :动画结束时 X坐标位置
   duration :动画持续时间
  -->
  <translate
    android:duration="800"
    android:fromXDelta="100%p"
    android:toXDelta="0" />
</set>

slide_left_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
  <translate
    android:duration="800"
    android:fromXDelta="0"
    android:toXDelta="-100%p" />
</set>

slide_right_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
  <translate
    android:duration="800"
    android:fromXDelta="-100%p"
    android:toXDelta="0" />
</set>

slide_right_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
  <translate
    android:duration="800"
    android:fromXDelta="0"
    android:toXDelta="100%p" />
</set>

最后是Activity中的实现:

package net.loonggg.demo.slider;
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ViewFlipper;
public class MainActivity extends Activity implements OnGestureListener,
    OnTouchListener {
  private GestureDetector detector;
  private ViewFlipper myViewFlipper;
  private int[] imgs = { R.drawable.img0, R.drawable.img1, R.drawable.img2,
      R.drawable.img3, R.drawable.img4, R.drawable.img5 };
  private int displayedChildIndex = 0;
  private Button treasure_btn;
  private Button garbage_btn;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
    myViewFlipper = (ViewFlipper) findViewById(R.id.viewflipper);
    treasure_btn = (Button) findViewById(R.id.treasure_chest_btn);
    garbage_btn = (Button) findViewById(R.id.garbage_btn);
    myViewFlipper.setOnTouchListener(this);
    myViewFlipper.setLongClickable(true);// 设置长按事件
    // myViewFlipper.setAutoStart(true);// 设置是否自动播放,默认不自动播放
    detector = new GestureDetector(this);
    addFlipperView();
  }
  /**
   * 向FlipperView中动态添加View
   */
  private void addFlipperView() {
    for (int i = 0; i < imgs.length; i++) {
      View view = LayoutInflater.from(this).inflate(
          R.layout.myviewflipper, null);
      TextView title = (TextView) view.findViewById(R.id.view_title);
      title.setText("头像");
      ImageView iv = (ImageView) view.findViewById(R.id.view_image);
      iv.setBackgroundResource(imgs[i]);
      myViewFlipper.addView(view);
    }
  }
  @Override
  public boolean onDown(MotionEvent e) {
    return false;
  }
  @Override
  public void onShowPress(MotionEvent e) {
  }
  @Override
  public boolean onSingleTapUp(MotionEvent e) {
    return false;
  }
  @Override
  public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
      float distanceY) {
    return false;
  }
  @Override
  public void onLongPress(MotionEvent e) {
  }
  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
      float velocityY) {
    // 返回当前正在显示的子视图的索引
    displayedChildIndex = myViewFlipper.getDisplayedChild();
    final ImageView iv = (ImageView) myViewFlipper.getChildAt(
        displayedChildIndex).findViewById(R.id.view_image);
    if (e2.getX() - e1.getX() >= 100 && e1.getY() - e2.getY() >= 100) {
      AnimationSet outAnim = (AnimationSet) AnimationUtils.loadAnimation(
          this, R.anim.collect_treasure);
      iv.startAnimation(outAnim);
      outAnim.setAnimationListener(new AnimationListener() {
        public void onAnimationStart(Animation animation) {
        }
        public void onAnimationRepeat(Animation animation) {
        }
        public void onAnimationEnd(Animation animation) {
          showNextView();
          AnimationSet downAnim = (AnimationSet) AnimationUtils
              .loadAnimation(MainActivity.this, R.anim.up_or_down);
          treasure_btn.setAnimation(downAnim);
          iv.clearAnimation();
        }
      });
    } else if (e1.getX() - e2.getX() >= 100 && e2.getY() - e1.getY() >= 100) {
      AnimationSet outAnim = (AnimationSet) AnimationUtils.loadAnimation(
          this, R.anim.throw_garbage);
      iv.startAnimation(outAnim);
      outAnim.setAnimationListener(new AnimationListener() {
        public void onAnimationStart(Animation animation) {
        }
        public void onAnimationRepeat(Animation animation) {
        }
        public void onAnimationEnd(Animation animation) {
          showNextView();
          AnimationSet leftAnim = (AnimationSet) AnimationUtils
              .loadAnimation(MainActivity.this,
                  R.anim.left_or_right);
          garbage_btn.setAnimation(leftAnim);
          iv.clearAnimation();
        }
      });
    } else if (e1.getX() - e2.getX() >= 100) {
      showNextView();
    } else if (e2.getX() - e1.getX() >= 100) {
      showPreviousView();
    }
    return false;
  }
  private void showPreviousView() {
    myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.slide_right_in));
    myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
        R.anim.slide_right_out));
    myViewFlipper.showPrevious();
  }
  private void showNextView() {
    myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.slide_left_in));
    myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
        R.anim.slide_left_out));
    myViewFlipper.showNext();
  }
  @Override
  public boolean onTouch(View v, MotionEvent event) {
    return detector.onTouchEvent(event);
  }
}

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android使用ViewFlipper实现图片切换功能

    今天给大家简单的讲一下Android手势,目前市场上的App中手势的运用比较少. Android提供了两种手势: ①.Android提供了手势检测,并为手势检测提供了相应的监听器 ②.Android允许开发者添加手势,并提供了相应的API识别用户手势 在之前的一片博客我讲过如何使用ViewPager实现图片滑动切换 地址:Android使用ViewPager实现图片滑动预览效果 但是ViewPager拥有自带的手势识别,意思就是它会自动识别手势是右滑还是左滑. 今天我讲一下如何使用ViewFli

  • Android仿淘宝头条向上滚动广告条ViewFlipper

    所谓前人栽树,后人乘凉,在此感谢博主的贡献. 参考博文: 仿淘宝首页的淘宝头条View垂直滚动 欢迎关注我的微信公众号 不只是原创技术文章,更多的是对生活的思考总结 我在博主的基础上做了如下工作: 修复了滚动条第二条点击事件无法触发这个bug: 充分简化了自定义ViewFlipper类的代码: 添加了直接使用ViewFlipper控件实现同样效果: 先上效果图: 这里使用了一个比较少用的控件:ViewFlipper 学习一个未知的东西,第一步就是要搞懂what:学的这个东西是什么以及能够实现什么

  • ANDROID中使用VIEWFLIPPER类实现屏幕切换(关于坐标轴的问题已补充更改)

    屏幕切换指的是在同一个Activity内屏幕间的切换,ViewFlipper继承了Framelayout类,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果.如下动图: 该类有如下几个和动画相关的函数: setInAnimation:设置View进入屏幕时候使用的动画,该函数有两个版本,一个接受单个参数,类型为android.view.animation.Animation:一个接受两个参数,类型为Context和int,分别为Context对象和定义An

  • Android ViewFlipper翻转视图使用详解

    简介 ViewFlipper是Android自带的一个多页面管理控件且可以自动播放!它和ViewPager有所不同,ViewPager继承自ViewGroup,是一页一页的,可以带动画效果,可以兼容低版本:而ViewFlipper继承ViewAnimator,是一层一层的,切换View的时候可以设置动画效果,是Android 4.0才引入的新控件.使用场景和ViewPager基本一样,在很多时候都是用来实现进入应用后的引导页或者用于图片轮播显示. 常用方法 setInAnimation:View

  • 解析Android中实现滑动翻页之ViewFlipper的使用详解

    1)View切换的控件-ViewFlipper介绍 ViewFilpper类继承于ViewAnimator类.而ViewAnimator类继承于FrameLayout. 查看ViewAnimator类的源码可以看出此类的作用主要是为其中的View切换提供动画效果.该类有如下几个和动画相关的方法. setInAnimation:设置View进入屏幕时候使用的动画.该方法有两个重载方法,即可以直接传入Animation对象,也可以传入定义的Animation文件的resourceID. setOut

  • Android ViewFlipper用法实例分析

    本文实例讲述了Android ViewFlipper用法.分享给大家供大家参考,具体如下: 这里实现的效果是当手动滑动手机屏幕时会一个一个地显示图片,一次显示一张图片 package com.my.viewflippertest; import android.app.Activity; import android.os.Bundle; import android.view.GestureDetector; import android.view.GestureDetector.OnGest

  • Android ViewFlipper简单用法解析

    ViewFlipper和ViewPager挺像的,都是一个view容器.内部可以添加多个view,只是viewpager可以通过左右滑动来切换view,而viewFlipper则没有这个功能,所以需要在它上面监听手势.比较方便的是它不用使用适配器就能添加view,所以比较方便. 首先在布局文件中定义这个控件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&qu

  • Android中利用viewflipper动画切换屏幕效果

    整个项目的 package com.example.viewflipper; import android.R.integer; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.GestureDetector.OnDoubleTapListener; import android.view.Menu; import android.view.Me

  • Android中使用ViewFlipper进行手势切换实例

    本文实例讲述了Android中使用ViewFlipper进行手势切换的方法,分享给大家供大家参考.具体实现步骤如下: 首先在layout的xml文件中定义一个ViewFlipper: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?>  <ViewFlipper xmlns:android="http://schemas.android.com/apk/res/android" 

  • Android TextSwitcher文本切换器和ViewFlipper使用详解

    本文为大家分享了Android TextSwitcher文本切换器的使用,供大家参考,具体内容如下 1.TextSwitcher 使用: 应用分为三步: 1.得到 TextSwitcher 实例对象   TextSwitcher switcher = (TextSwitcher) findViewById(R.id.textSwitcher); 2.为switcher指定ViewSwitcher.ViewFactory工厂,该工厂会产生出转换时需要的View   switcher.setFact

随机推荐