Android 多点触控通信 技术关键点解析

因为研究 多点触控与ios以及web端的进行通信总结,现总结下Android多点触控,技术关键点

1.首先说明一下,三个函数作用:

getaction()

getactionMasked()

getactionIndex()

2.具体内容如下:

public static final int ACTION_MASK            = 0xff;

public static final int ACTION_POINTER_INDEX_MASK  = 0xff00;

public static final int ACTION_POINTER_INDEX_SHIFT = 8;

  public final int getAction() {

        return nativeGetAction(mNativePtr);

    }

public final int getActionMasked() {

        return nativeGetAction(mNativePtr) & ACTION_MASK;

    }

public final int getActionIndex() {

        return (nativeGetAction(mNativePtr) & ACTION_POINTER_INDEX_MASK)

                >> ACTION_POINTER_INDEX_SHIFT;

    }

3.

再讲解之前,首先我们需要明确一下,关于多点触控其他的一些字段的数据信息

downTime

eventTime

pointerCount

MotionEvent.PointerProperties[] 

MotionEvent.PointerCoords[]

width

height

其中PointerProperties  PointerCoords是两个对象

PointerProperties  对象中有 2个比较重要的字段

id

tooltype

PointerCoords 对象中有4个比较重要的对象

X  点击的x坐标

Y  点击的y坐标

pressure  按压的力度 力度值在 0 -1 之间,正常情况下  我么的触屏是0-0.1之前,当然具体手机具体参考

size  按压的面积  面积之同样在0 - 1 之间,

首先讲解downTime  :

从字面意思来说,感觉可能是按下的时间,但是其实这个名字是有误导意义的,

实际上它的作用是指的一次完整的按键事件的开始的时间,比如一次滑动事件,downtime是第一根手指落下的时间

(或者说屏幕上第一个落下手指的时间那次事件),也就是这次滑动事件开始的时间,再比如一次点击事件,或者截屏操作,总而言之,任何的一次操作的那个开始的时间。

eventTime:

这个比较简单:他是某次touch事件的执行时间;比如按下的这一时刻,执行时间

pointercount:

当前这次事件的指针数量

注意:这个地方有一个比较特殊的地方,就是当你有三根手指按在屏幕上,

当你松开的时候,此时你松开了一个手指,那么按理来说应该是剩下两个,pointercount是2

但是实际上还是三个,因为他代表的是那一时刻,指针的数量。(包含你松开的那个手指的指针)

再次注意:

不管是按下还是松开:没有同时松开两个手指的情况,即便你快出天际的松开,也会在事件的体现上,你是一根一根的手指松开。

现在来说

PointerProperties :

这个叫做指针的属性,其中一个字段非常重要叫做id:

id:的作用是用来表示当前的标识,是某个pointer的id值,用来标识她的唯一性;

注意,id的作用只是来标识她的唯一性,没有其他的意义。

id的排序从0开始,你一个手指按下,id为0

如果在按下则为1 ,再按下则为2 .以此类推

那么就 1 2 3 4 5

这个时候松开

2 和 3

那么

2 和 3 位置空置

如果这个时候有新加入的手指

则填补 2 和 3 的位置,按照 进入的先后顺序

PointerCoords:

x 坐标

y 坐标

pressure

size

对于这4个值来说没有什么特殊点要讲解的

唯一要说的是x 和y 是float类型

到此基本属性已经讲完,现在来说比较有意义的三个函数

getAction()  getActionMasked()  getActionIndex()

先看getAction的代码

  return nativeGetAction(mNativePtr);

我们并不清楚getaction做了什么,通过注释也只是知道它里面包含触控点信息;

getaction,主要存了两个内容

一个是触控数组索引,一个是触控事件动作

由高8位来存储 触控数组索引, 由低八位来存储触控事件动作

我们简称index和touchaction吧

首先来说touchaction,这个touchaction是代表的当前事件的动作。什么动作呢:

比如 按下,松开,多点按下,多点松开,滑动

对应的值 0  1        5  6                2

当然还有其他值,我们就先不做讨论

按下,松开,以及滑动,我就不多说什么了,

现在说下多点按下和多点松开,多点按下是指的第二个手指按下,以及第n个手指按下的事件都称为多指按下

同理多点松开也是一个道理

注意一点,不管多个手指按下还是多个手指松开,touchaction的顺序一定是0 5 6 1当然也有可能是0 5 5 5 6 6 6 1等等可能,看你按下的手指的数量来决定

总之是对称的555 和666 是对称来的。 而且开头和结尾一定是 0 1

touchaction说明白了之后,

我们在来说:

index:

首先我们需要知道在用户触摸事件中,有一个隐形的可变数组,数组不能有空置的索引元素。

这个数组是用来存储每个手指变化的节点的数组。

明白之后,

当我们按下1个手指之后,就把这个手指放入的数组中,

当我们按下第2个手指之后,就把这个手指放入的数组中,此时数组的的索引最大值为1

这个时候如果我们松开第二个手指的话,那么就要把数组中的索引为1的元素剔除,此时index就是1

如果这个时候我们松开第一个手指的话,那么就要把数组中的索引为0的元素剔除,此时index就是0

ok结束

再次开始一次

当我们按下1个手指之后,就把这个手指放入的数组中,

当我们按下第2个手指之后,就把这个手指放入的数组中,此时数组的的索引最大值为1

当我们按下第3个手指之后,就把这个手指放入的数组中,此时数组的的索引最大值为2

这个时候如果我们松开第二个手指的话,那么就要把数组中的索引为1的元素剔除,此时index就是1.

而且于此同时可变数组索引为1的位置,空闲,但是这个数组不能有空闲位置,所以就要把第三个手指的元素前移

,也就是第三个手指的元素要放入的索引为1的位置中去。

那么如果再有手指进来则以此类推。

如果再有手指出来也同样以此类推。

ok结束

再次开始一次

当我们按下1个手指之后,就把这个手指放入的数组中,

当我们按下第2个手指之后,就把这个手指放入的数组中,此时数组的的索引最大值为1

当我们按下第3个手指之后,就把这个手指放入的数组中,此时数组的的索引最大值为2

当我们松开第一个手指,那么就要把数组中的索引为0的元素剔除,此时index就是0.

当我们松开第二个手指,那么就要把数组中的索引为0的元素剔除,此时index就是0.

当我们松开第三个手指,那么就要把数组中的索引为0的元素剔除,此时index就是0.

对,以上几行我没有写错。

你看明白了吗? 亲

好了;分析到此结束,

这个时候你再去看

getaction = getactionindex+getactionmasked(当然我这么写不太准确)因为他们是高8位与低八位的组合。

但是你再回头看这几个函数相信你能看懂的。

你可能感兴趣的:(Android 多点触控通信 技术关键点解析)