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 位就得到了 序号的值