首页 > 其他分享 >Android 滑动效果入门篇(一)—— ViewFlipper

Android 滑动效果入门篇(一)—— ViewFlipper

时间:2022-10-06 11:34:17浏览次数:90  
标签:MotionEvent GestureDetector ViewFlipper 入门篇 事件 自动播放 Android android view


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

Android 滑动效果入门篇(一)—— ViewFlipper_android


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

Android 滑动效果入门篇(一)—— ViewFlipper_android_02


Activity


[java]  ​​view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​



  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. this;

  21. viewFlipper = (ViewFlipper) findViewById(R.id.viewflipper);
  22. new GestureDetector(this);    // 声明检测手势事件

  23. for (int i = 0; i < imgs.length; i++) {          // 添加图片源
  24. new ImageView(this);
  25. iv.setImageResource(imgs[i]);
  26. iv.setScaleType(ImageView.ScaleType.FIT_XY);
  27. new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
  28. }

  29. true);         // 设置自动播放功能(点击事件,前自动播放)
  30. 3000);
  31. if(viewFlipper.isAutoStart() && !viewFlipper.isFlipping()){
  32. viewFlipper.startFlipping();
  33. }
  34. }

  35. @Override
  36. public boolean onTouchEvent(MotionEvent event) {
  37. // 点击事件后,停止自动播放
  38. 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. // 向右滑动左侧进入的渐变效果(alpha  0.1 -> 1.0)
  45. // 向右滑动右侧滑出的渐变效果(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. // 向左滑动左侧进入的渐变效果(alpha 0.1  -> 1.0)
  52. // 向左滑动右侧滑出的渐变效果(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



[html]  ​​view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​



  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

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双击事件,类似于鼠标的双击事件,接口三个抽象回调函数如下

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

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

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); 用于监听手势事件

GestureDetector.OnGestureListener手势监听的gestureDetector.onTouchEvent(event);事件接口

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


[html]  ​​view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​



  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


[html]  ​​view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​



  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


[html]  ​​view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​



  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

 —— 右出渐变效果



[html]  ​​view plain​​​ ​​​copy​​​ ​​​print​​​ ​​​?​



  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

表示图片从不透明(1.0)到透明(0.1)

标签:MotionEvent,GestureDetector,ViewFlipper,入门篇,事件,自动播放,Android,android,view
From: https://blog.51cto.com/jdsjlzx/5733502

相关文章

  • Android 滑动效果入门篇(二)—— Gallery
    ​​​Gallery​​ 是Android官方提供的一个View容器类,继承于AbsSpinner类,用于实现页面滑动效果。从上面的继承关系可以看出,AbsSpinner类继承自AdapterView,因此我们可以......
  • Android 使用Gallery实现Tab
    main.xml布局文件: Java代码​​​​1.<?xmlversion="1.0"encoding="utf-8"?>2.<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/androi......
  • Android Asynchronous HTTPClient的实现和优化
    大家知道Android对UI线程的反应时间要求很高,超过5秒钟直接ANR掉,根本不给你机会多等。而Android应用与后端系统的交互是最基本的需求之一,如何实现高效的AsynchronousHTTPCli......
  • Android GridView控件自定义
    虽然​​Android​​​已自带了GridView,但是,却不够灵活,同时也不能自由添加控件,因此,本人通过需要进一步封装,来实现​​Android自定义GridView控件​​,达到自己需要的效果。......
  • Android实现渐显按钮的左右滑动效果
    本示例演示在Android中实现带渐显按钮的左右滑动效果。关于滑动效果,在我的上一篇博文中提到过,有兴趣的朋友可以访问如果大家想实现带指引效果的左右滑动,请访问博先看下......
  • Android闪屏示例程序
     用过手机QQ的基本上都知道,刚启动程序时候会在一个界面停留一会,按任意键的就直接跳过,这就是所谓的闪屏。那么,在Android中怎样实现这样的效果呢? 1、新建一个Android项目,命......
  • Android实现图片倒影效果
    ​​android倒影实现抖动的镜面效果​​​​http://clareshao.iteye.com/blog/1419695​​android中的gallery的一个样式,具有倒影效果。左右滑动也不错。​​http://down......
  • Android开发--构建项目安装包APK(debug版)
    1.build→BuildAPK(s),点击即可构建2.点击日志可以查看构建情况3.点击locate即可进入debug文件夹4.也可以在构建完成后直接按照路径找到debug文件夹其中apk文件即所需安装......
  • Android类加载流程
    背景由于前前前阵子写了个壳,得去了解类的加载流程,当时记了一些潦草的笔记。这几天把这些东西简单梳理了一下,本文分析的代码基于Android8.1.0源码。流程分析从loadClass......
  • Tubian Linux 0.45,兼容Windows和Android的国产Linux系统!
    Github主页(提供下载):https://github.com/jinshulumengchuang/Tubian-Linux123网盘下载:https://www.123pan.com/s/XjkKVv-JO9Uvhttps://www.123pan.com/s/XjkKVv-BO9Uvhtt......