MotionEvent、多点操作相关

本文详细解析了Android系统中多点触摸事件的工作原理,包括不同API级别下的触控事件类型,如ACTION_DOWN、ACTION_UP等,以及如何通过MotionEvent获取触摸点的信息。介绍了如何区分多个触摸点,并跟踪特定触摸点的动作。

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

gesture
一次gesture 包括从第一个手指头按下到最后一个手指头离开屏幕中的所有Event

MotionEvent
多点触摸时,每个点叫一个pointer, MotionEvent含有该时刻,所有pointer的信息。
每一个pointer有一个唯一的id,这个id是在该pointer刚碰触屏幕的时候赋值的(ACTION_DOWN、ACTION_POINTER_DOWN时),
有效期直到该点离开屏幕或者取消。但是pointer的序号 pointerIndex 在有效期的每个 MotionEvent 中都是不一定的,
需要用pointerId 来跟踪某一个手指的所有动作。getPointerId(int pointerIndex) 返回Id,再用 findPointerIndex(int pointerId) 等到index.

API Level 1:
ACTION_DOWN    // 第一个手指头按下的时候触发(pointIndex 是0),其他手指头再按的时候是触发 ACTION_POINTER_DOWN
ACTION_MOVE   
ACTION_UP      // 最后一个手指头抬起的时候触发(pointIndex 是0),不一定是第一个按下的手指头
ACTION_CANCEL  // 这一次触屏动作被取消

API Level 3:
ACTION_OUTSIDE

API Level 5:
ACTION_POINTER_DOWN  // 要得到这几个ACTION 需要: (event.getAction() & MotionEvent.ACTION_MASK)  否则直接用 event.getAction() 会很诡异。
ACTION_POINTER_UP    // 不是最后一个手指抬起的时候触发

// 下面这几个在 API Level 8 中已经 deprecated,统一放在 ACTION_POINTER_DOWN、ACTION_POINTER_UP 中,用  ACTION_POINTER_INDEX_MASK 来获取序号
ACTION_POINTER_1_DOWN
ACTION_POINTER_1_UP
ACTION_POINTER_2_DOWN
ACTION_POINTER_2_UP
ACTION_POINTER_3_DOWN
ACTION_POINTER_3_UP

API Level 5:
ACTION_MASK   (0x000000ff)
ACTION_POINTER_ID_MASK         (0x0000ff00)     //在 API Level 8 中deprecated   
ACTION_POINTER_ID_SHIFT        (0x00000008)     //在 API Level 8 中deprecated   

API Level 8:
int getActionMasked()
int getActionIndex()

ACTION_POINTER_INDEX_MASK      (0x0000ff00)
ACTION_POINTER_INDEX_SHIFT     (0x00000008)

API Level 1:
getRawX()
getRawY();
getX()
getY()

API Level 5:
getX(int pointerIndex)
getY(int pointerIndex)

API Level 5:
getPointerId (int pointerIndex)
findPointerIndex (int pointerId)
getPointerCount()


多点触摸的时候要获得正确的ACTION:
API Level 5 的时候可以用   event.getAction() & MotionEvent.ACTION_MASK
API Level 8 的时候可以用: event.getActionMasked()

其实 getActionMasked() 的实现就是 event.getAction() & MotionEvent.ACTION_MASK
getActionIndex() 的实现是 (event.getAction() & ACTION_POINTER_INDEX_MASK) >> ACTION_POINTER_INDEX_SHIFT;


API Level 5 以后
getAction() 得到的是一个int值,他其实包含了事件类型(actionType)和事件序号(pointerIndex)两个内容

actionType: 低8位 (0-7位)
pointerIndex: 8-15位

而 ACTION_MASK 的值:0x000000ff      
所以 event.getAction() & MotionEvent.ACTION_MASK 及是取低8位的 actionType 值
而ACTION_POINTER_ID_MASK的值:0x0000ff00  (API Level 8 以后改名为 ACTION_POINTER_INDEX_MASK,但值是一样的)
所以 event.getAction() & ACTION_POINTER_INDEX_MASK 就是取第 8-15 位,然后再右移 8 位就得到了 序号的值

 

 

 


 

转载于:https://www.cnblogs.com/zijianlu/archive/2013/04/27/3047609.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值