聪明出于勤奋,天才在于积累

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

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

 

 

 


 

posted on 2013-04-27 17:48    阅读(835)  评论(0编辑  收藏  举报