多点触控笔记

一.多点触控的事件类型

单点触控可以用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),获得历史坐标值等。

普通简单的游戏体验还好,但是像王者荣耀这样的大型游戏,操作比较复杂,对触控事件的精细度要求很高,不容易完全模拟,玩起来比较『涩』。

你可能感兴趣的:(android学习笔记,android,多点触控)