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. Asp.net 字符(二)

    using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...

  2. Python基础:函数

    一.概述 二.声明.定义和调用 三.参数 1.参数传递 2.实参类型 3.形参绑定 四.返回值 五.名字空间与作用域 1.基本概念 2.名字空间 3.作用域 4.总原则 六.高级 1.装饰器 2.生成 ...

  3. 查询分页的几种Sql写法

    查询分页的几种Sql写法 摘自:http://www.cnblogs.com/zcttxs/archive/2012/04/01/2429151.html 1.创建测试环境,(插入100万条数据大概耗 ...

  4. 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirectionsTask, MapDownloaderTask

    [源码下载] 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirec ...

  5. Linux守护进程实现程序只运行一次

    1.守护进程 守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件. 2.让程序只运行一次 如果让程序只运行一次,有很多方法,此处的一种 ...

  6. 验证坐标在某片坐标区域内 php 代码

    之前碰到的这样一个需求,要将公司的服务范围在地图中显示出来,并将用户每天的访问坐标进行统计看有多少用户是在所能达到的服务范围半径内. 以下是PHP代码的实现 (仅验证坐标在某片坐标区域内) <? ...

  7. Struts2执行过程解析

    说到Struts2执行过程就少不了一张图: 1 客户端初始化一个指向Servlet容器的请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextClea ...

  8. Java中处理异常中return关键字

    Java中,执行try-catch-finally语句需要注意: 第一:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂 ...

  9. MS10-046漏洞测试

    这次用到MS10-046这个远程执行漏洞(Windows快捷方式LNK文件自动执行代码漏洞攻击) 命令: 1.   msfconsole    //启动MSF Metasploit 2.   sear ...

  10. SharePoint 2013 使用查阅项实现联动下拉框

    SharePoint列表使用中,经常会用到下拉框,而有些特殊的需求,会用到联动的下拉框,在SharePoint中默认没有这样的字段,所以如果实现,我们需要自己想办法. 这里,我们介绍如何使用JQuer ...