ViewFilpper 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以设定时间间隔,让它自动播放。
又ViewAnimator继承至于FrameLayout的,所以ViewFilpper的Layout里面可以放置多个View,继承关系如下:

本示例通过ViewFlipper和GestureDetector.OnGestureListener实现自动播放和手势滑屏事件,先看效果:

Activity

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.GestureDetector;
  4. import android.view.MotionEvent;
  5. import android.view.ViewGroup.LayoutParams;
  6. import android.view.animation.Animation;
  7. import android.view.animation.AnimationUtils;
  8. import android.widget.ImageView;
  9. import android.widget.ViewFlipper;
  10. public class ViewFlipperActivity extends Activity implements android.view.GestureDetector.OnGestureListener {
  11. private int[] imgs = { R.drawable.img1, R.drawable.img2,
  12. R.drawable.img3, R.drawable.img4, R.drawable.img5 };
  13. private GestureDetector gestureDetector = null;
  14. private ViewFlipper viewFlipper = null;
  15. private Activity mActivity = null;
  16. @Override
  17. public void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main);
  20. mActivity = this;
  21. viewFlipper = (ViewFlipper) findViewById(R.id.viewflipper);
  22. gestureDetector = new GestureDetector(this);    // 声明检测手势事件
  23. for (int i = 0; i < imgs.length; i++) {          // 添加图片源
  24. ImageView iv = new ImageView(this);
  25. iv.setImageResource(imgs[i]);
  26. iv.setScaleType(ImageView.ScaleType.FIT_XY);
  27. viewFlipper.addView(iv, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
  28. }
  29. viewFlipper.setAutoStart(true);         // 设置自动播放功能(点击事件,前自动播放)
  30. viewFlipper.setFlipInterval(3000);
  31. if(viewFlipper.isAutoStart() && !viewFlipper.isFlipping()){
  32. viewFlipper.startFlipping();
  33. }
  34. }
  35. @Override
  36. public boolean onTouchEvent(MotionEvent event) {
  37. viewFlipper.stopFlipping();             // 点击事件后,停止自动播放
  38. viewFlipper.setAutoStart(false);
  39. return gestureDetector.onTouchEvent(event);         // 注册手势事件
  40. }
  41. @Override
  42. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
  43. if (e2.getX() - e1.getX() > 120) {            // 从左向右滑动(左进右出)
  44. Animation rInAnim = AnimationUtils.loadAnimation(mActivity, R.anim.push_right_in);  // 向右滑动左侧进入的渐变效果(alpha  0.1 -> 1.0)
  45. Animation rOutAnim = AnimationUtils.loadAnimation(mActivity, R.anim.push_right_out); // 向右滑动右侧滑出的渐变效果(alpha 1.0  -> 0.1)
  46. viewFlipper.setInAnimation(rInAnim);
  47. viewFlipper.setOutAnimation(rOutAnim);
  48. viewFlipper.showPrevious();
  49. return true;
  50. } else if (e2.getX() - e1.getX() < -120) {        // 从右向左滑动(右进左出)
  51. Animation lInAnim = AnimationUtils.loadAnimation(mActivity, R.anim.push_left_in);       // 向左滑动左侧进入的渐变效果(alpha 0.1  -> 1.0)
  52. Animation lOutAnim = AnimationUtils.loadAnimation(mActivity, R.anim.push_left_out);     // 向左滑动右侧滑出的渐变效果(alpha 1.0  -> 0.1)
  53. viewFlipper.setInAnimation(lInAnim);
  54. viewFlipper.setOutAnimation(lOutAnim);
  55. viewFlipper.showNext();
  56. return true;
  57. }
  58. return true;
  59. }
  60. @Override
  61. public boolean onDown(MotionEvent e) {
  62. return false;
  63. }
  64. @Override
  65. public void onLongPress(MotionEvent e) {
  66. }
  67. @Override
  68. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
  69. return false;
  70. }
  71. @Override
  72. public void onShowPress(MotionEvent e) {
  73. }
  74. @Override
  75. public boolean onSingleTapUp(MotionEvent e) {
  76. return false;
  77. }
  78. }

main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <ViewFlipper
  7. android:id="@+id/viewflipper"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"/>
  10. </LinearLayout>

示例分析

一、自动播放

ViewFlipper控件,是ImageView的容器,用于添加显示的图片资源,主要功能有两个:添加显示View和自动播放View

通过实现父类android.view.ViewGroup的addView(View child, ViewGroup.LayoutParams params)添加View资源,即图片和填充样式

启动自动播放View,可以通过设置如下三个成员函数实现:

1、 setAutoStart(true),设置是否自动播放功能,true为自动播放,false为不自动播放,开启自动播放设为true

2、 setFlipInterval(int milliseconds),设置View播放的时间间隔,如3000(3秒)

3、 startFlipping(),开始自动播放

停止自动播放View,设置成员函数如下:

1、 stopFlipping(),停止自动播放

2、 setAutoStart(false),停止自动播放,设为false

二、手势滑屏

手势滑动屏幕动画,是通过android.view.GestureDetector类检测各种手势事件实现的,该类有两个回调接口(Interface)

A、GestureDetector.OnDoubleTapListener,用来通知DoubleTap双击事件,类似于鼠标的双击事件,接口三个抽象回调函数如下

1、onDoubleTap(MotionEvent e):DoubleTap双击手势事件后通知(触发)

2、onDoubleTapEvent(MotionEvent e):DoubleTap双击手势事件之间通知(触发),包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知)

3、onSingleTapConfirmed(MotionEvent e):用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势;那么如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,此时触发的就是SingleTapConfirmed事件

B、GestureDetector.OnGestureListener,用来通知普通的手势事件(down、longPress、scroll、up等),接口具体的六个抽象回调函数如下

1、onDown(MotionEvent e):down事件,表示按下事件

2、onSingleTapUp(MotionEvent e):一次点击up事件,表示按下后的抬起事件

3、onShowPress(MotionEvent e):down事件发生而move或则up还没发生前触发该事件,此事件一般用于通知用户press按击事件已发生

4、onLongPress(MotionEvent e):长按事件,down事件后up事件前的一段时间间隔后(由系统分配,也可自定义),如果仍然按住屏幕则视为长按事件

5、onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑动手势事件,例如scroll事件后突然up,fling的速度大小由e每秒x和y改变大小决定

6、onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上拖动事件,即down按下点——scroll拖动——up抬起点的move移动事件

本示例的滑动屏幕动画,仅用到了上面的GestureDetector.OnGestureListener及其onFling事件,具体实现步骤如下:

1、Activity实现android.view.GestureDetector.OnGestureListener 监听接口,并声明gestureDetector = new GestureDetector(this); 用于监听手势事件

2、在Activity的成员函数onTouchEvent(MotionEvent event)中,注册GestureDetector.OnGestureListener手势监听的gestureDetector.onTouchEvent(event);事件接口

3、在GestureDetector.OnGestureListener回调函数onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 中,实现滑屏动画

三、屏幕渐变效果

1、 当手势从左向右滑动时,图片是左进右出

if (e2.getX() - e1.getX() > 120) ,即up终点(e2)与down起点(e1)的滑动距离大于120,来检测从左向右滑动事件

push_left_in.xml —— 左进渐变效果

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <translate
  4. android:duration="1500"
  5. android:fromXDelta="100%p"
  6. android:toXDelta="0" />
  7. <alpha
  8. android:duration="1500"
  9. android:fromAlpha="0.1"
  10. android:toAlpha="1.0" />
  11. </set>

push_left_out.xml —— 右出渐变效果

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <translate
  4. android:duration="1500"
  5. android:fromXDelta="0"
  6. android:toXDelta="-100%p" />
  7. <alpha
  8. android:duration="1500"
  9. android:fromAlpha="1.0"
  10. android:toAlpha="0.1" />
  11. </set>

2、 当手势从右向左滑动时,图片是右进左出

if (e2.getX() - e1.getX() < -120) ,即up终点(e2)与down起点(e1)的滑动距离小于-120,来检测从右向左滑动事件

push_right_in.xml —— 右进渐变效果

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <translate
  4. android:duration="1500"
  5. android:fromXDelta="-100%p"
  6. android:toXDelta="0" />
  7. <alpha
  8. android:duration="1500"
  9. android:fromAlpha="0.1"
  10. android:toAlpha="1.0" />
  11. </set>

push_right_out.xml —— 右出渐变效果

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <translate
  4. android:duration="1500"
  5. android:fromXDelta="0"
  6. android:toXDelta="100%p" />
  7. <alpha
  8. android:duration="1500"
  9. android:fromAlpha="1.0"
  10. android:toAlpha="0.1" />
  11. </set>

其中,android:duration表示渐变持续时间;translate表示位移变换;alpha表示透明度变换

translate

android:fromXDelta="-100%p"   android:toXDelta="0" 表示图片从左进入,从不可见到可见

android:fromXDelta="0" android:toXDelta="100%p"    表示图片从右滑出,从可见到不可见

alpha

android:fromAlpha="1.0"  android:toAlpha="0.1" 表示图片从不透明(1.0)到透明(0.1)

android:fromAlpha="0.1"  android:toAlpha="1.0" 表示图片从透明(0.1)到不透明(1.0)

Android 滑动效果入门篇(一)—— ViewFlipper的更多相关文章

  1. Android 滑动效果入门篇(二)—— Gallery

    Gallery 是Android官方提供的一个View容器类,继承于AbsSpinner类,用于实现页面滑动效果. 从上面的继承关系可以看出,AbsSpinner类继承自AdapterView,因此我 ...

  2. Android 滑动效果进阶篇(六)—— 倒影效果

    上篇介绍了使用Animation实现3D动画旋转翻页效果,现在介绍图片倒影实现,先看效果图 本示例主要通过自定义Gallery和ImageAdapter(继承自BaseAdapter)实现 1.倒影绘 ...

  3. Android 滑动效果高级篇(八)—— 自定义控件

    自定义控件,较常用View.ViewGroup.Scroller三个类,其继承关系如下: 本示例自定义控件,实现一个Gallery效果,并添加了一个显示View个数和位置的bar条,效果图: 自定义控 ...

  4. Android 滑动效果进阶篇(五)—— 3D旋转

    前面介绍了利用Android自带的控件,进行滑动翻页制作效果,现在我们通过代码实现一些滑动翻页的动画效果. Animation实现动画有两个方式:帧动画(frame-by-frame animatio ...

  5. Android 滑动效果基础篇(四)—— Gallery + GridView

    Android系统自带一个GridView和Gallery两个控件,GridView网格显示,Gallery单个浏览,两者结合起来可以真正实现Gallery浏览图片效果. 本示例通过GridView和 ...

  6. Android 滑动效果基础篇(三)—— Gallery仿图像集浏览

    Android系统自带一个Gallery浏览图片的应用,通过手指拖动时能够非常流畅的显示图片,用户交互和体验都很好. 本示例就是通过Gallery和自定义的View,模仿实现一个仿Gallery图像集 ...

  7. Android 滑动效果高级篇(七)—— 华丽翻页效果

    By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 之前看到像ipad上的ibook的模拟书籍翻页的特效感觉很炫,在android上也有像laputa和ireader ...

  8. 十六、Android 滑动效果汇总

    Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...

  9. Android 滑动效果汇总

    Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...

随机推荐

  1. Web开发者选择的最佳HTML5/CSS3代码生成器

    原文地址:http://codecloud.net/css3-code-generators-for-web-programmers-6672.htmlHTML5 和CSS3是一入门就能用的最好的语言 ...

  2. sql 事务使用

    BEGIN TRAN Tran_Money --开始事务 DECLARE @tran_error int; SET @tran_error = 0; BEGIN TRY UPDATE tb_Money ...

  3. AC自动机(1)

    Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).    ...

  4. COMMIT WORK AND WAIT 是在WAIT什么

    wait 还是不wait,这是个问题.       这是同步更新还是异步更新的问题:如果是只commit work,是异步更新,触发注册在当前SAP LUW中所有数据更新动作,数据更新动作由SAP的更 ...

  5. Q:关于Outlook for CRM 中预览记录窗体的设置

    问题: 如何在Outlook for CRM中,将实体记录的预览窗口的信息做调整? 解决方案: 在Outlook里,在打开实体后选择View=>Customize Reading Pane,这里 ...

  6. Microsoft Dynamics CRM 2013 安装程序及SDK 下载地址

    Microsoft Dynamics CRM 2013 已经具有相关资料 2013 Setup (Microsoft Dynamics CRM Server 2013) 下载地址: http://ww ...

  7. Atitit.图片木马的原理与防范 attilax 总结

    Atitit.图片木马的原理与防范 attilax 总结 1.1. 像图片的木马桌面程序1 1.2. Web 服务端图片木马1 1.3. 利用了Windows的漏洞1 1.4. 这些漏洞不止Windo ...

  8. JSP page指令详解

    JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言. 语法格式如下: <%@ directive attribute="value" %> 指令可以 ...

  9. Android软键盘与输入框的设置

    大家开发Android或者用app的时候会发现转到输入框就会自动弹出软键盘,切换别的页面就会自动的隐藏,下面几行代码用的熟练了就行了: 1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) I ...

  10. 【转】IOS中各种常用控件的默认高度,很全

    1.状态栏 状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用.如下图   用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者半 ...