因为研究 多点触控与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位与低八位的组合。
但是你再回头看这几个函数相信你能看懂的。