Android MotionEvent:如何获取屏幕上移除的触摸点准确数量?
问题解答
为什么getPointerCount()返回2而不是1
你日志中输出的actionMasked值6对应MotionEvent.ACTION_POINTER_UP常量,该事件的触发时机是触摸点即将被移除的瞬间,事件本身仍然会携带即将被移除的这个触摸点的完整信息。getPointerCount()返回的是当前事件包含的所有触摸点总数,此时即将移除的点还未被从计数中剔除,就会出现“抬了一根手指但计数还是2”的情况。
如何获取准确的触摸点移除数量/活跃触摸点数量
- 常规场景下,
ACTION_UP、ACTION_POINTER_UP单次触发仅对应1个触摸点被移除,安卓系统的触摸事件分发逻辑中,这两类事件单次只会处理一个触摸点的抬起动作。 - 如果需要持续追踪当前屏幕上的活跃触摸点总数,可以自行维护一个计数变量,按事件类型更新:
- 收到
ACTION_DOWN时,计数置为1 - 收到
ACTION_POINTER_DOWN时,计数加1 - 收到
ACTION_POINTER_UP或ACTION_UP时,计数减1 - 收到
ACTION_CANCEL(触摸事件被系统打断,比如弹窗弹出、切后台)时,计数清0
- 收到
- 如果需要获取本次被移除的触摸点的标识,可以通过
motionEvent.getActionIndex()拿到该点在当前事件中的索引,再调用motionEvent.getPointerId(index)获得该点的唯一id,用于后续匹配逻辑。
内容的提问来源于stack exchange,提问作者totoaussi
相关产品推荐
相关产品推荐

