Android 多点触控算法理解(Multi-touch)

当有多个手指触摸屏幕时,Android是怎样处理这些事件的呢?

假设现在有三根手指,它们分别是手指A,B,C。

threeFingers.jpg

Pointer:

三个手指向屏幕传递的东西可以被抽象为一个个的触摸点(Pointer)。

PointerIndex:

按照触碰到屏幕的顺序来分,每个Pointer都有一个index,这个算法有点特别。现在举例来帮助你理解。

情景一:
       假设手指A,B,C依次按照顺序按在了屏幕上,那么
       手指A(Pointer_A)分配的Index为0;
       手指B(Pointer_B)分配的Index为1;
       手指C(Pointer_C)分配的Index为2;

看到Index,你是否想起了数组下标?没错你可以认为这三个Pointer被安置在了一个数组里,数组大小为Pointer的个数。

int[Pointer个数] Pointers = {Pointer_A,Pointer_B,Pointer_C};

每个Pointer都保存了自己当前的位置信息,例如X值和Y值。在MotionEvent实例对象的getX(index)或getY(index)方法中就可以获得它们。

有一天,我拿右手的三根手指(食指A,中指B,无名指C)在屏幕上做滑动手势,我是先用食指A接触屏幕,再拿中指B接触到,最后拿无名指C接触到屏幕,这三根手指的起始位置都贴着屏幕的最左边也就是X轴接近于0的地方。这时候以触碰到屏幕的次序为依据,这三根手指分别被赋予了各自的index,其中食指A最先接触,index为0中指B第二个接触,index为1无名指C第三个接触,index为2

无聊透顶的我在往右滑动的过程中,把中指B松开了,这下index为1的中指B从数列中被移除了,安卓说:哦,index为1的这个地方被移除过Pointer,并且这个index为1的位置还是第一个被移除的,我记录下来了。
移除完后呢,总不能空着吧,现在就两个Pointer在屏幕上,我总不能按三个来算吧。我是把目前index为0Pointer(食指A)转移到index为1的位置上,还是把目前index为2Pointer( 无名指C )转移到index为1的位置上呢?

是的,谷歌和你一样都很机智,他们把index为2的向前移了,这样数组尺寸就变小了。
既然之前说了我无聊透顶,目前我好像还不够无聊,为了贯彻这个词语,我在快要滑到屏幕右侧的时候,我又加了一根手指进来,这次加的还不是原来那根黄金中指B,而是我的 小拇指D!而且非常风骚地伸到了屏幕的左侧去了,这意味着我这个Pointer小拇指D的X值是很小的,正当我盯着index为2的位置观看我风骚小拇指创造的位置数据时,惊奇地发现我的小拇指被赋予的index竟然为1!!!在后来的实验中,不管我放的是原来率先释放的中指B还是什么一阳指,卫生指。他们被赋予的index都是1!!!

这意味着,如果在一个初始大小确定的Pointer数组中出现了某个Pointer被移除的情况,那么系统将记录住被移除的Pointer当时的index,在之后如果有新的Pointer产生,新来的Pointer将被直接赋予该index。


有的老油条就会说,我要是四根里中途撤了两根呢?

经过试验,当Pointer个数为正整数,并且在后续移除掉若干Pointer时,系统将根据移除顺序,记录被移除的Pointer所对应的index,在之后如果有新的Pointer加入,则率先进入的新Pointer将被分配到曾经率先空缺的index。

比如index分别为0,1,2,3的四个Pointer,其中index为2的Pointer率先中途移除,然后index为3的Pointer接着被移除,系统将记录哪个index是最先出现空缺的,哪个index是第二个出现空缺的,然后接下来新产生的Pointer将按产生的顺序,先来的放到最先出现空缺的index上,在这里,最新来的Pointer将被放置在最先出现空缺的index为2的位置上。下一个来的Pointer将被放置在index为3的位置上.

你可能感兴趣的:(Android 多点触控算法理解(Multi-touch))