android4.0.3 多点触控

来源:互联网 发布:汽车配件仓库软件 编辑:程序博客网 时间:2024/05/13 03:21

android上若想使屏幕同时监听到两个或者两个以上的手指触摸事件,那就要用到多点触控了,多点触控要求android sdk最低版本2.0。其实多点触控也没想象的那么难,难点就在操作的变换处理,例如,一个手指正在EVENT_MOVE的时候,另一个手指加入了触摸,这时,就要从单点状态转入多点状态的EVENT_MOVE,这时,第一个手指先移开与第二个手指先移开,状态又有所区别。。


多点触控的时候
也是写在ontouch  或ontouchEvent

event.getPointerCount()获得触摸个数

通过event.getPointerId(index) 根据索引获得触摸id。

event.getX(index) //   index 第几个触摸点  从0开始  获得此点的X 坐标
event.getY(index)//                              获得此点的Y 坐标
其他的MotionEvent 方法与单点触摸类似

注意触摸索引与触摸id的区别:
手指(触摸)索引:当前手指是第几个触摸的手指,如果前面的手指离开了,索引会减少。[比如 原本是1 但是前面的0离开了 ,1就变成了0]
手指(触摸)ID:当手指触摸后就会分配给他ID,手指离开不会对其他手指ID影响,但是新进入的手指ID会从0开始找到一个没有使用的id(比如ID 0 ,1 如果0 离开了 1不变,但是新进入的并不是2,而是重新使用0)
总结一下:
引索至于当前手指触摸的顺序有关。
而ID是已进入即不可改变,且数字不留空。后面进来的会补充空缺的。

触摸状态的变换:

先说下action的值:

简单的说就是id*256+多点action(多点时:down 5     up 6    move 2       单点时: down 0    up 1      move 2)

其实第二个体手指按下的action值是16进制数0×00000105 的值,第二个字节表示id 第一个字节表示action(多点时:down 5     up 6    move 2       单点时: down 0    up 1      move 2)

一、在多点触摸时,第二个手指先离开。
1:当点下第一个点时 action应该是0,此时还是认为是单点触摸。
此时此手指引索为0,ID为0;
2:当殿下第二个点时:action应该是261。第二个手指的引索为1     ID为1
此时已经被认为是多点触摸了。
3 : 当松开第二个手指时,action应该为:262,(256+6):
此时认为是多点触摸离开一个手指。
4:再松开第一个手指时,action应该为:1
此时只有一个手指在屏幕上,所以认为是单点触摸。

二、第一个手指先离开
与上1,2相同
3,当松开第一个手指时:action应该为:6(0*256+6)
此时认为是多点触摸。ID为0的手指离开。第二个手指的引索变为0,id还是1.
4: 当第二个手指 离开时,action为:1
此时如果按照前面的理论应该输出262(1*256+6) 但是android认为最后一个来开的手指触发的action必为1。

三、第一个手指先离开再按回来。
与上1,2相同
3,当松开第一个手指时:action应该为:6(0*256+6)
此时认为是多点触摸。ID为0的手指离开。第二个手指的引索变为0,id还是1.
4,当点回第一个手指时:aciton应该为:6
此时认为是多点触摸。ID为0的手指进入,引索为1。[此时第二个手指id为1,引索为0]
[新进入的手指会从0开始找ID如果 空缺就是用 而引索只是触摸的时间上的先后顺序来决定的]
5,当第二个手指离开时:action应该为:262(256+6)
如一的3~4

最后,对event.getAction()的处理:

pointerAction = event.getAction();

pointerId = event.getPointerId(0);//通过索引值得到id

if (event.getPointerCount() > 1) {// 手指触摸多于一个   与运算 和移位运算得出 pointerId;

pointerId = (pointerAction & MotionEvent.ACTION_POINTER_ID_MASK) >>>

MotionEvent.ACTION_POINTER_ID_SHIFT;

}

// 与运算得出 PointerAction  得到Action Down , move or   Up

pointerAction = (event.getAction() & MotionEvent.ACTION_MASK) % 5;

 

// 根据pointer id 找到 对应的索引值

pointerIndex = event.findPointerIndex(pointerId);

}