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的位置上.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容