標籤:觸控 多點觸摸 觸控螢幕
1.檢查當前螢幕有多少個觸摸點。使用MotionEvent的getPointerCount()方法。
2.多點觸控下,觸摸的狀態的檢測MotionEvent類中方法getActionMasked(),這個方法可以檢查觸摸的狀態:
當只有一個觸摸點時(只用一根手指觸控螢幕幕),按下是0,起來是1,移動是2;
當觸摸點多於1時(多根手指觸控螢幕幕),按下是5,起來是6,移動是2;3.多點觸控下,每個觸點的分類處理多點觸摸時 假如是第i個點 int x = event.getX(i); int y = event.getY(i);則第i個點的座標就是 P(x,y)
通過event.getActionIndex()來得到觸控操作點的索引,也就是擷取當前這個動作是第幾個觸點。
4.多點觸控下的幾個特殊事件MotionEvent.ACTION_POINTER_DOWN:當螢幕上已經有一個點被按住,此時再按下其他點時觸發。
MotionEvent.ACTION_POINTER_UP:當螢幕上有多個點被按住,鬆開其中一個點時觸發(即非最後一個點被放開時)。
5.如何精確類比一個手勢事件對象
static public MotionEvent obtain(long downTime, long eventTime, int action, int pointerCount, PointerProperties[] pointerProperties, PointerCoords[] pointerCoords, int metaState, int buttonState, float xPrecision, float yPrecision, int deviceId, int edgeFlags, int source, int flags) { MotionEvent ev = obtain(); ev.mNativePtr = nativeInitialize(ev.mNativePtr, deviceId, source, action, flags, edgeFlags, metaState, buttonState, 0, 0, xPrecision, yPrecision, downTime * NS_PER_MS, eventTime * NS_PER_MS, pointerCount, pointerProperties, pointerCoords); return ev; }
該方法用來擷取一個類比事件,參數意義為:】參數1:downTime,使用者最初按下以啟動一連串的位置事件時的時間,這個時間值必須是從SystemClock的uptimeMillis()方法擷取到的才行。
參數2:eventTime,這個手勢事件建立的時間,這個時間值必須是從SystemClock的uptimeMillis()方法擷取到的才行。
參數3:action ,想要類比動作的類型,比如:ACTION_DOWN等
參數4:pointerCount,這個時間中觸點的數目
參數5:pointerProperties,一個大小為pointerCount的數組,為每一個點提供PointerProperties類型的對象,這個對象必須包括點的標示符。
參數6:pointerCoords,一個大小為pointerCount的數組,為每一個點提供PointerCoords類型的對象
參數7:metaState,當事件形成時,起了作用的修飾鍵也叫元鍵,比如shift,ctrl,alt鍵,這些鍵的狀態
參數8:buttonState,被按下的按鈕的狀態
參數9:xPrecision,X座標的精度
參數10:yPrecision,Y座標的精度
參數11:deviceId,產生這個事件的裝置的id。如果是0表示事件不是一個物理裝置產生的,其他值都是任意的並且你不能依賴這些任意值
參數12:edgeFlags,一個位欄位值,表明螢幕的哪個邊框,如果有的話,被這個手勢碰到了。
參數13:source,這個事件的源
參數14:手勢事件的標記
6.非精確類比一個手勢事件對象類比一個MotionEvent對象,這裡我們使用MotionEvent的obtain()方法,參數如下
MotionEvent.obtain(downTime, eventTime, action, x, y, metaState);
7.類比點擊在螢幕中間類比一次ACTION_DOWN事件
另外你要類比滑動事件則類比成MotionEvent.ACTION_MOVE即可
onTouch(mPageView, MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, screenWidth / 2, screenHeight / 2, 0));
8.常用方法Android多點觸控
event.getAction() //擷取觸控動作比如ACTION_DOWN
event.getPointerCount(); //擷取觸控點的數量,比如2則可能是兩個手指同時按壓螢幕
event.getPointerId(nID); //對於每個觸控的點的細節,我們可以通過一個迴圈執行getPointerId方法擷取索引
event.getX(nID); //擷取第nID個觸控點的x位置
event.getY(nID); //擷取第nID個點觸控的y位置
event.getPressure(nID); //LCD可以感應出使用者的手指壓力,當然具體的層級由驅動和物理硬體決定的
event.getDownTime() //按下開始時間
event.getEventTime() // 事件結束時間
event.getEventTime()-event.getDownTime()); //總共按下時花費時間
getX()和getRawX()的區別
getX()是表示Widget相對於自身左上方的x座標,而getRawX()是表示相對於螢幕左上方的x座標值(注意:這個螢幕左上方是手機螢幕左上方,不管activity是否有titleBar或是否全螢幕),getY(),getRawY()一樣的道理
當用於觸控時:
getRowX:觸摸點相對於螢幕的座標
getX:觸摸點相對於按鈕的座標
getTop:按鈕左上方相對於父view(LinerLayout)的y座標
getLeft:按鈕左上方相對於父view(LinerLayout)的x座標