多點觸控筆記

一.多點觸控的事件類型

單點觸控可以用event.getAction() 獲得觸摸事件的類型:ACTION_DOWN、ACTION_UP、ACTION_MOVE
對於多點觸控呢?

不能再用getAction獲得事件類型,要通過getActionMask獲得(getActionMask是通用的方法,也適用於單點觸控),除了上面那三個事件,還有兩個事件:

ACTION_POINTER_DOWN: 除第一個指針以外進入屏幕的其他指針。
ACTION_POINTER_UP: 除第一個指針以外退出屏幕的其他指針。

也就是說手指A,B:

A按下(DOWN)->B按下(POINTER_DOWN)->A擡起(POINTER_UP)->B擡起(UP)

ACTION_MOVE的事件在多點觸控場景表現不變。

二.多點觸控的區分

一個MotionEvent就可以包含多個手指的事件,區分主要依靠兩個概念:
pointerID: 也就是手指的ID,按下到擡起都不會變。通過getPointerId(int index)獲取
pointerIndex: 在這次事件裏手指事件的索引,按下到擡起是可能會變的。

比如:手指A,B,C

都依次按下後:
id: 0,1,2
index: 0,1,2

如果中途手指B擡起,AC就變成:
id: 0,2
index: 0,1

三.多點觸控事件的處理

假如getActionMask返回的是POINTER_DOWN或者POINTER_UP,代表這個MotionEvent裏面有且只有一個手指是按下或者離開屏幕,可以通過getActionIndex拿到這個事件的索引去處理。

需要注意的是,一個MotionEvent裏面也不可能同時出現POINTER_DOWN和POINTER_UP事件。

對個這個event中的剩下手指,都是MOVE事件,代表所有的手指都是在滑動,可以通過getX/Y(int pointerIndex)獲取這個手指滑動的座標。

四.正向處理容易,反向構建難。

手動構建MotionEvent的算法並不容易實現,在實踐中,雖然能簡單模仿多點觸控,但是還有很多細節沒有實現,除了上面說到的index,id,action等屬性要處理,還要很多一些方法實現是不確定的,比如有getHistorical*(int index),獲得歷史座標值等。

普通簡單的遊戲體驗還好,但是像王者榮耀這樣的大型遊戲,操作比較複雜,對觸控事件的精細度要求很高,不容易完全模擬,玩起來比較『澀』。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章