因?yàn)檠芯?多點(diǎn)觸控與ios以及web端的進(jìn)行通信總結(jié),現(xiàn)總結(jié)下Android多點(diǎn)觸控冠王,技術(shù)關(guān)鍵點(diǎn)
1.首先說明一下,三個(gè)函數(shù)作用:
getaction()
getactionMasked()
getactionIndex()
2.具體內(nèi)容如下:
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.
再講解之前,首先我們需要明確一下结澄,關(guān)于多點(diǎn)觸控其他的一些字段的數(shù)據(jù)信息
downTime
eventTime
pointerCount
MotionEvent.PointerProperties[]?
MotionEvent.PointerCoords[]
width
height
其中PointerProperties? PointerCoords是兩個(gè)對象
PointerProperties? 對象中有 2個(gè)比較重要的字段
id
tooltype
PointerCoords 對象中有4個(gè)比較重要的對象
X? 點(diǎn)擊的x坐標(biāo)
Y? 點(diǎn)擊的y坐標(biāo)
pressure? 按壓的力度 力度值在 0 -1 之間奕枝,正常情況下? 我么的觸屏是0-0.1之前棺榔,當(dāng)然具體手機(jī)具體參考
size? 按壓的面積? 面積之同樣在0 - 1 之間,
首先講解downTime? :
從字面意思來說隘道,感覺可能是按下的時(shí)間症歇,但是其實(shí)這個(gè)名字是有誤導(dǎo)意義的郎笆,
實(shí)際上它的作用是指的一次完整的按鍵事件的開始的時(shí)間,比如一次滑動事件当船,downtime是第一根手指落下的時(shí)間
(或者說屏幕上第一個(gè)落下手指的時(shí)間那次事件)题画,也就是這次滑動事件開始的時(shí)間,再比如一次點(diǎn)擊事件德频,或者截屏操作苍息,總而言之,任何的一次操作的那個(gè)開始的時(shí)間壹置。
eventTime:
這個(gè)比較簡單:他是某次touch事件的執(zhí)行時(shí)間竞思;比如按下的這一時(shí)刻,執(zhí)行時(shí)間
pointercount:
當(dāng)前這次事件的指針數(shù)量
注意:這個(gè)地方有一個(gè)比較特殊的地方钞护,就是當(dāng)你有三根手指按在屏幕上盖喷,
當(dāng)你松開的時(shí)候,此時(shí)你松開了一個(gè)手指难咕,那么按理來說應(yīng)該是剩下兩個(gè)课梳,pointercount是2
但是實(shí)際上還是三個(gè),因?yàn)樗淼氖悄且粫r(shí)刻余佃,指針的數(shù)量暮刃。(包含你松開的那個(gè)手指的指針)
再次注意:
不管是按下還是松開:沒有同時(shí)松開兩個(gè)手指的情況,即便你快出天際的松開爆土,也會在事件的體現(xiàn)上椭懊,你是一根一根的手指松開。
現(xiàn)在來說
PointerProperties :
這個(gè)叫做指針的屬性步势,其中一個(gè)字段非常重要叫做id:
id:的作用是用來表示當(dāng)前的標(biāo)識氧猬,是某個(gè)pointer的id值,用來標(biāo)識她的唯一性坏瘩;
注意盅抚,id的作用只是來標(biāo)識她的唯一性,沒有其他的意義桑腮。
id的排序從0開始泉哈,你一個(gè)手指按下,id為0
如果在按下則為1 破讨,再按下則為2 .以此類推
那么就 1 2 3 4 5
這個(gè)時(shí)候松開
2 和 3
那么
2 和 3 位置空置
如果這個(gè)時(shí)候有新加入的手指
則填補(bǔ) 2 和 3 的位置丛晦,按照 進(jìn)入的先后順序
PointerCoords:
x 坐標(biāo)
y 坐標(biāo)
pressure
size
對于這4個(gè)值來說沒有什么特殊點(diǎn)要講解的
唯一要說的是x 和y 是float類型
到此基本屬性已經(jīng)講完,現(xiàn)在來說比較有意義的三個(gè)函數(shù)
getAction()? getActionMasked()? getActionIndex()
先看getAction的代碼
? return nativeGetAction(mNativePtr);
我們并不清楚getaction做了什么提陶,通過注釋也只是知道它里面包含觸控點(diǎn)信息烫沙;
getaction,主要存了兩個(gè)內(nèi)容
一個(gè)是觸控?cái)?shù)組索引隙笆,一個(gè)是觸控事件動作
由高8位來存儲 觸控?cái)?shù)組索引锌蓄, 由低八位來存儲觸控事件動作
我們簡稱index和touchaction吧
首先來說touchaction升筏,這個(gè)touchaction是代表的當(dāng)前事件的動作。什么動作呢:
比如 按下瘸爽,松開您访,多點(diǎn)按下,多點(diǎn)松開剪决,滑動
對應(yīng)的值 0? 1? ? ? ? 5? 6? ? ? ? ? ? ? ? 2
當(dāng)然還有其他值灵汪,我們就先不做討論
按下,松開柑潦,以及滑動享言,我就不多說什么了,
現(xiàn)在說下多點(diǎn)按下和多點(diǎn)松開渗鬼,多點(diǎn)按下是指的第二個(gè)手指按下览露,以及第n個(gè)手指按下的事件都稱為多指按下
同理多點(diǎn)松開也是一個(gè)道理
注意一點(diǎn),不管多個(gè)手指按下還是多個(gè)手指松開譬胎,touchaction的順序一定是0 5 6 1當(dāng)然也有可能是0 5 5 5 6 6 6 1等等可能差牛,看你按下的手指的數(shù)量來決定
總之是對稱的555 和666 是對稱來的。 而且開頭和結(jié)尾一定是 0 1
touchaction說明白了之后堰乔,
我們在來說:
index:
首先我們需要知道在用戶觸摸事件中多糠,有一個(gè)隱形的可變數(shù)組,數(shù)組不能有空置的索引元素浩考。
這個(gè)數(shù)組是用來存儲每個(gè)手指變化的節(jié)點(diǎn)的數(shù)組。
明白之后被盈,
當(dāng)我們按下1個(gè)手指之后析孽,就把這個(gè)手指放入的數(shù)組中,
當(dāng)我們按下第2個(gè)手指之后只怎,就把這個(gè)手指放入的數(shù)組中袜瞬,此時(shí)數(shù)組的的索引最大值為1
這個(gè)時(shí)候如果我們松開第二個(gè)手指的話,那么就要把數(shù)組中的索引為1的元素剔除身堡,此時(shí)index就是1
如果這個(gè)時(shí)候我們松開第一個(gè)手指的話邓尤,那么就要把數(shù)組中的索引為0的元素剔除,此時(shí)index就是0
ok結(jié)束
再次開始一次
當(dāng)我們按下1個(gè)手指之后贴谎,就把這個(gè)手指放入的數(shù)組中汞扎,
當(dāng)我們按下第2個(gè)手指之后,就把這個(gè)手指放入的數(shù)組中擅这,此時(shí)數(shù)組的的索引最大值為1
當(dāng)我們按下第3個(gè)手指之后澈魄,就把這個(gè)手指放入的數(shù)組中,此時(shí)數(shù)組的的索引最大值為2
這個(gè)時(shí)候如果我們松開第二個(gè)手指的話仲翎,那么就要把數(shù)組中的索引為1的元素剔除痹扇,此時(shí)index就是1.
而且于此同時(shí)可變數(shù)組索引為1的位置铛漓,空閑,但是這個(gè)數(shù)組不能有空閑位置鲫构,所以就要把第三個(gè)手指的元素前移
浓恶,也就是第三個(gè)手指的元素要放入的索引為1的位置中去。
那么如果再有手指進(jìn)來則以此類推结笨。
如果再有手指出來也同樣以此類推包晰。
ok結(jié)束
再次開始一次
當(dāng)我們按下1個(gè)手指之后,就把這個(gè)手指放入的數(shù)組中禀梳,
當(dāng)我們按下第2個(gè)手指之后杜窄,就把這個(gè)手指放入的數(shù)組中,此時(shí)數(shù)組的的索引最大值為1
當(dāng)我們按下第3個(gè)手指之后算途,就把這個(gè)手指放入的數(shù)組中塞耕,此時(shí)數(shù)組的的索引最大值為2
當(dāng)我們松開第一個(gè)手指,那么就要把數(shù)組中的索引為0的元素剔除嘴瓤,此時(shí)index就是0.
當(dāng)我們松開第二個(gè)手指扫外,那么就要把數(shù)組中的索引為0的元素剔除,此時(shí)index就是0.
當(dāng)我們松開第三個(gè)手指廓脆,那么就要把數(shù)組中的索引為0的元素剔除筛谚,此時(shí)index就是0.
對,以上幾行我沒有寫錯(cuò)停忿。
你看明白了嗎驾讲? 親??
好了;分析到此結(jié)束席赂,
這個(gè)時(shí)候你再去看
getaction = getactionindex+getactionmasked(當(dāng)然我這么寫不太準(zhǔn)確)因?yàn)樗麄兪歉?位與低八位的組合吮铭。
但是你再回頭看這幾個(gè)函數(shù)相信你能看懂的。