现在网上还是有很多博客在
onTouchEvent()
处理触摸反馈判断时使用的
MotionEvent.getAction()
,那么
MotionEvent.getAction()
和
MotionEvent.getActionMasked()
有什么区别呢?为什么推荐我们使用
MotionEvent.getActionMasked()
?
MotionEvent.getAction()
是在早期 Android 版本就已经存在,在只有单点触控的时候
只包含事件信息
,比如 MotionEvent.ACTION_DOWN 、MotionEvent.ACTION_UP、MotionEvent.ACTION_MOVE。
但在多点触控时它就多了一个信息:还需要知道按下的时候你是第一个手指还是非第一个手指,抬起的时候是最后一个手指抬起了还是非最后一个手指抬起了
。
因为多点触控的处理逻辑和单点触控不同,比如 MotionEvent.ACTION_POINTER_DOWN、MotionEvent.ACTION_POINTER_UP,所以就要区分两种分别处理,Android 因此在 API 8 提供了
MotionEvent.getActionMasked()
和
MotionEvent.getActionIndex()
。
那么
MotionEvent.getAction()
就要将两个信息压缩到32位的 int 类型里面,而
MotionEvent.getActionMasked()
是拆分了信息只有事件信息。
因此在现在的单点触控情况下使用
MotionEvent.getAction()
是可以正常使用的,但在多点触控情况下,它没有将多点触控的信息拆分全部压在32位 int 类型里面,所以处理的信息就会是错误的。
实际开发中,我们推荐使用
MotionEvent.getActionMasked()
和
MotionEvent.getActionIndex()
来分别判断回调的事件信息和获取哪个手指处理事件。
单点触控事件序列: