Android 多点触控常见操作和一些方法总结

本文总结了Android 2.0+中多点触控的支持和使用,包括MotionEvent.getAction()方法在识别用户操作类型中的应用,以及如何处理ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。在多点触控场景下,ACTION_DOWN不再被监听,ACTION_POINTER_DOWN和ACTION_POINTER_UP成为关注点。通过pointerIndex和pointerId可以跟踪每个触摸点的坐标和顺序,以便在复杂的触控交互中定位特定点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 2.0 + 支持多点触控,Google 封装了一套很好用的处理方式。

常用的方法:

1.触控动作类型 MotionEvent.getAction() 该方法返回值常用来判断用户操作事件类型。其返回值是int类型 ,低八位二进制位为Action 动作本身识别位码(eg. ACTION_DOWN ,ACTION_MOVE 等所代表的值);高八位二进制位为多点触控时该点 pointerIndex索引值。例如:当第二个触控点触发时的返回值 00000001 00000101 其高位码00000001表示第2个点索引为1,低位码5表示Action类型:一个非主控点触发的区分码值(ACTION_POINTER_DOWN)。 pointerIndex可用来获取该Pointer的坐标值MotionEvent.getX/Y(int pointerIndex)。在OnTouchEvent()中判断多点触控时Action类型,可用 event.getAciton() & MontionEvent.ACTION_MASK ,屏蔽高位索引获取低位动作类型。

2.触控点的索引 event.getActionIndex() 返回触控点的索引值 等同于通过移位操作 (event.getAciton() & MotionEvent.ACTION_POINTER_INDEX_MASK) >>MotionEvent.ACTION_POINTER_INDEX_SHIFT)
索引值+1即可得到当前屏幕上有多少触摸点。
3. 触摸事件 OnTouchEvent  可引入 VelocityTracker 类将 ACTION_DOWN ,ACTION_MOVE,ACTION_UP 等关注的事件加入追踪器,处理用户的操作事件的合集。VelocityTracker维护一个被hide注释仅供内部使用的Estimator类(其封装了时间的单元和数据统计单元的处理细节)。在MotionEvent.ACTION_DOWN中可通过VelocityTracker.obtain()实例化一个全局的追踪器对象,同时记得在MotionEvent.ACTION_UP 和 MotionEvent.ACTION_CANCEL 时对VelocityTracker对象做非空判断然后调用recycle()方法回收。VelocityTracker的一些使用技巧:eg. 1. 判断拖拽/滑动动作是否有效:分别计算出在X,Y 轴的位移增量与系统定义的最溢出常量(可通过ViewConfiguration.getScaledTouchSlop()获得具体配置的值)根据毕达哥拉斯定理(a ^2 + b^ = c^2)比较判断 eg. 2. 判断是否为Fling快速滑动 当手指离开时通过VelocityTracker.computeCurrentVelocity(int units) (指定需要统计速率的单位时间) 调用该方法后,通过分别调用
 float vX = VelocityTracker.getXVelocity(); float vY = VelocityTracker.getYVelocity(); 判断 vX,vY 只要其中之一大于 系统Fling动作常量(可通过ViewConfiguration.getScaledMinimumFlingVelocity() 获取该值)
4.onInterceptTouchEvent() 该方法为触摸事件拦截器 当返回值为true 时将事件消费掉并且传递给自己的OnTouchEvent(),子控件将不再获得Touch事件 ;而 OntouchEvent() 事件当返回值为true时将消费掉touch事件不再传递,该方法的返回值很重要。一般重写这个方法常用来分离用户关注的触摸事件。

5. 当屏幕触摸点数 > 1时,MotionEvent.ACTION_DOWN,不再被监听执行,ACTION_POINTER_DOWN被监听。当一个非主控触摸点离开时,ACTION_POINTER_UP被监听到。假如 5个触摸点顺序依次为A,B,C,D,E 则索引pointerIndex 依次为 0,1,2,3,4 pointerId (event.getPointerId(int pointerIndex)) 依次为 0,1,2,3,4 如果离开的点是第一个触发的点(A),则第二个点(B)的 pointerIndex 变为 0,其他点坐标索引按照触发顺序依次递增。此时如果通过event.getPointerId(int pointerIndex) 返回的仍是是该点实际触发的顺序值。主要用通过确定在多点触控情况下通过判断点的顺序来确定特殊点的坐标。当屏幕上的点逐渐离开,最后会触发ACTION_UP 。

(本文内容参考查阅一些资料同时综合个人实践总结完成,与大家分享,错误地方欢迎指正,谢谢!)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值