分类: 嵌入式
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); }