Chinaunix首页 | 论坛 | 博客
  • 博客访问: 639824
  • 博文数量: 171
  • 博客积分: 2246
  • 博客等级: 大尉
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 11:45
文章分类

全部博文(171)

文章存档

2018年(3)

2017年(4)

2015年(1)

2014年(20)

2013年(57)

2012年(86)

分类: 嵌入式

2012-07-31 17:30:50

来源:http://blog.csdn.net/baimingyong007/article/details/7668997

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);

}

阅读(860) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~