多点触控笔记
一.多點觸控的事件類型
單點觸控可以用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),獲得歷史坐標值等。
普通簡單的游戲體驗還好,但是像王者榮耀這樣的大型游戲,操作比較復雜,對觸控事件的精細度要求很高,不容易完全模擬,玩起來比較『澀』。
總結
- 上一篇: 凯恩斯主义两个重要观念的由来
- 下一篇: 通过nginx代理实现内网访问百度地图方