Android自定义View滑动事件处理总结

 

滑动处理需要用到的各种工具类:


android.view.VelocityTracker

android.view.OverScroller

android.view.ViewConfiguration

 

VelocityTracker类 

 

主要用跟踪触摸屏事件(flinging事件和其他gestures手势事件)的速率。

用addMovement(MotionEvent)函数将Motion event加入到VelocityTracker类实例中。你可以使用getXVelocity() 或getXVelocity()获得横向和竖向的速率,但是使用它们之前请先调用computeCurrentVelocity(int units)来初始化速率的单位 。

 

computeCurrentVelocity(int units, float maxVelocity)

unitis表示速率的基本时间单位。unitis值为1的表示是,一毫秒时间单位内运动了多少个像素, unitis值为1000表示一秒(1000毫秒)时间单位内运动了多少个像素
maxVelocity表示速率的最大值 
 
复制代码
 1 @Override
 2     public boolean onTouchEvent(MotionEvent event) {
 3         // 获得允许执行一个fling手势动作的最大速度值
 4         int mMaximumVelocity = ViewConfiguration.get(context)
 5                 .getScaledMaximumFlingVelocity();
 6 
 7         // 实例化
 8         VelocityTracker mVelocityTracker = VelocityTracker.obtain();
 9         mVelocityTracker.addMovement(event);
10         int action = event.getAction();
11         float y = event.getY();
12 
13         switch (action) {
14         case MotionEvent.ACTION_DOWN:
15 
16             return true;
17         case MotionEvent.ACTION_MOVE:
18 
19             break;
20         case MotionEvent.ACTION_CANCEL:
21             // 回收
22             mVelocityTracker.recycle();
23 
24             break;
25         case MotionEvent.ACTION_UP:
26             // 初始化速率的单位
27             mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
28             int velocityY = (int) mVelocityTracker.getYVelocity();
29 
30             // 回收
31             mVelocityTracker.recycle();
32 
33             break;
34         }
35 
36         return super.onTouchEvent(event);
37     }
复制代码

 

OverScroller类

 

是为了实现View平滑滚动的一个Helper类。它的作用就是辅助记录和计算我们滑动的距离和速度这些,用于自定义移动时帮我们处理掉数学的计算部分。

1 OverScroller mScroller = new OverScroller(context);
2 //滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间
3 mScroller.startScroll(int startX, int startY, int dx, int dy) 
4 //使用默认完成时间250ms
5 mScroller.startScroll(int startX, int startY, int dx, int dy, int duration)
6 //返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。
7 mScroller.computeScrollOffset()

 

设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动。

 

 

ViewConfiguration类

 

这个类主要定义了UI中所使用到的标准常量,像超时、尺寸、距离,如果我们需要得到这些常量的数据,我们就可以通过这个类来获取

1  //获得触发移动事件的最短距离,如果小于这个距离就不触发移动控件
2 int mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
3 //获得允许执行一个fling手势动作的最大速度值
4 int mMaximumVelocity = ViewConfiguration.get(context).getScaledMaximumFlingVelocity();
5 //获得允许执行一个fling手势动作的最小速度值
6 int mMinimumVelocity = ViewConfiguration.get(context).getScaledMinimumFlingVelocity();

 

 

如果布局控件以及其子控件的尺寸进行精确的控制那就要重写下面这个方法了

onMeasure(int widthMeasureSpec, int heightMeasureSpec)

 

 

posted on   屌丝迷途  阅读(2475)  评论(0编辑  收藏  举报

编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

统计

点击右上角即可分享
微信分享提示