首页 > 其他分享 >Android 滑动效果基础篇(三)—— Gallery仿图像集浏览

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

时间:2022-10-06 11:35:27浏览次数:59  
标签:MotionEvent int 滑动 Android null e1 Gallery e2


Android系统自带一个Gallery浏览图片的应用,通过手指拖动时能够非常流畅的显示图片,用户交互和体验都很好。

本示例就是通过Gallery和自定义的View,模仿实现一个仿Gallery图像集的图片浏览效果。效果图如下:


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

1、基本原理

在 Activity 中实现 OnGestureListener 的接口 onFling() 手势事件,通过自定义的 View 绘制draw() 图片

2、Activity

Activity中,通过onTouchEvent() 注册 myGesture.onTouchEvent(event)


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



  1. @Override
  2. public boolean onTouchEvent(MotionEvent event) {
  3. switch (event.getAction()) {
  4. case MotionEvent.ACTION_UP:
  5. 0);           // 手指抬起后,重置滑动距离offsetX = 0
  6. break;
  7. }

  8. return myGesture.onTouchEvent(event);
  9. }


接着实现接口OnGestureListener 的 onScroll()方法,给继承自View的 FlingView 的handleScroll()成员方法传递滑动参数,获取滑动的x轴距离


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



  1. @Override
  2. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
  3. 1 * (int) distanceX);
  4. return true;
  5. }


接着实现接口OnGestureListener 的 OnFling()方法,给继承自View的 FlingView 的onFling()成员方法传递滑动参数,获取手势的速度


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



  1. @Override
  2. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
  3. int) - velocityX);
  4. return true;
  5. }



3、FlingView

FlingView中,获取来自Activity中的手势速度


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



  1. public void onFling(int paramFloat1) {
  2. if (offsetX > GalleryDemoActivity.deviceScreenWidth / 5) {
  3. if (fBitmap != null) {
  4. true;
  5. true;
  6. }
  7. else if (offsetX < -GalleryDemoActivity.deviceScreenWidth / 5) {
  8. if (nBitmap != null) {
  9. true;
  10. true;
  11. }
  12. }
  13. // 开始动画效果
  14. new MyAnimation());
  15. }


在滑动过程中,通过实现View的Draw()方法绘制图片,注意:此时需要同时绘制当前图片(获取焦点)和下一张图片(即将获取焦点)共两张图片


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



  1. @Override
  2. public void draw(Canvas canvas) {
  3. new Paint();
  4. new Rect();
  5. canvas.drawColor(Color.BLACK);

  6. // 绘制当前图片
  7. if (bitmap != null) {
  8. int left = offsetX;
  9. int top = offsetY;
  10. int right = offsetX + GalleryDemoActivity.deviceScreenWidth;
  11. int bottom = offsetY + GalleryDemoActivity.deviceScreenHeight;
  12. rect.set(left, top, right, bottom);
  13. null, rect, paint);
  14. }

  15. // 绘制下一张图片
  16. if (offsetX < 0) {           // 向左滑动
  17. if (nBitmap != null) {
  18. int left = GalleryDemoActivity.deviceScreenWidth + 15 + offsetX;
  19. int top = 0;
  20. int right = left + GalleryDemoActivity.deviceScreenWidth;
  21. int bottom = GalleryDemoActivity.deviceScreenHeight;
  22. rect.set(left, top, right, bottom);
  23. null, rect, paint);
  24. }
  25. else if (offsetX > 0) {        // 向右滑动
  26. if (fBitmap != null) {
  27. int left = -GalleryDemoActivity.deviceScreenWidth - 15 + offsetX;
  28. int top = 0;
  29. int right = left + GalleryDemoActivity.deviceScreenWidth;
  30. int bottom = GalleryDemoActivity.deviceScreenHeight;
  31. rect.set(left, top, right, bottom);
  32. null, rect, paint);
  33. }
  34. }
  35. }


在滑动图片结束后,需要做滑动动画后的处理,重新设置当前图片和当前图片的上一张和下一张的状态,为下次滑动做准备


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



  1. @Override
  2. protected void onAnimationEnd() {
  3. if (isFlingRight) {         // 向右滑动,position减1
  4. nBitmap = bitmap;
  5. bitmap = fBitmap;
  6. null;
  7. 1;
  8. else if (isFlingLeft) {       // 向左滑动,position加1
  9. fBitmap = bitmap;
  10. bitmap = nBitmap;
  11. null;
  12. 1;
  13. }

  14. false;
  15. false;
  16. false;
  17. 0;
  18. if (fBitmap == null && offsetX == 0) {          // 如果前一张图片为空(向右滑),则重置前一张图片(position - 1)
  19. if (postion > 0) {
  20. 1);
  21. }

  22. else if (nBitmap == null && offsetX == 0) {       // 如果后一张图片为空(向左滑),则重置后一张图片(position + 1)
  23. if (postion < bitmaps.length - 1) {
  24. 1);
  25. }
  26. }
  27. clearAnimation();
  28. }




4、手势坐标介绍



本示例中,用到了OnGestureListener接口的onScroll()和OnFling()方法,涉及到了Android系统坐标及触摸MotionEvent e1和e2、速度velocityX、velocityY等值


Android屏幕坐标系如下图(左)


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

(1)MotionEvent中 e1是手指第一次按上屏幕的起点,e2是抬起手指离开屏幕的终点,根据上图Android屏幕坐标系可知:

右滑动,终点(e2)在起点(e1)的右侧,有e2.getX() - e1.getX() 大于0
手指向左滑动,终点(e2)在起点(e1)的左侧,有e2.getX() - e1.getX() 小于0
手指向下滑动,终点(e2)在起点(e1)的下侧,有e2.getY() - e1.getY() 大于0
手指向上滑动,终点(e2)在起点(e1)的上侧,有e2.getY() - e1.getY() 小于0

(2)onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)

distanceX,是前后两次call的X距离,不是e2与e1的水平距离

distanceX,是前后两次call的Y距离,不是e2与e1的垂直距离

具体数值的方向,请详见上图(中)

(3)onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 

velocityX,是X轴的每秒速度

velocityY,是Y轴的每秒速度

具体数值的方向,请详见上图(右)

仔细观察可以发现:velocityX、velocityY的方向与distanceX、distanceY方向正好相反

标签:MotionEvent,int,滑动,Android,null,e1,Gallery,e2
From: https://blog.51cto.com/jdsjlzx/5733501

相关文章

  • Android 滑动效果入门篇(一)—— ViewFlipper
    ​​​ViewFilpper​​ 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以设定时间间隔,让它自动播放。又ViewAnimator继承至于FrameLayout......
  • 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文件即所需安装......
  • 代码随想录day13 ● 150. 逆波兰表达式求值 ● 239. 滑动窗口最大值 ● 347.前 K
    150.逆波兰表达式求值解题步骤:第一步:创建一个栈;第二步:遍历整个数组;第三步:判断遍历到的元素是运算符还是数字;数字:直接压入栈中运算符:将栈顶两个元素做相应运......