使用MotionEvent的getPointerCount()方法。
MotionEvent類中方法getActionMasked(),這個方法可以檢查觸摸的狀态:
當隻有一個觸摸點時(隻用一根手指觸摸螢幕),按下是0,起來是1,移動是2;
當觸摸點多于1時(多根手指觸摸螢幕),按下是5,起來是6,移動是2;
多點觸摸時 假如是第i個點 int x = event.getX(i); int y = event.getY(i);則第i個點的坐标就是 P(x,y)
通過event.getActionIndex()來得到觸控操作點的索引,也就是擷取目前這個動作是第幾個觸點。
MotionEvent.ACTION_POINTER_DOWN:當螢幕上已經有一個點被按住,此時再按下其他點時觸發。
MotionEvent.ACTION_POINTER_UP:當螢幕上有多個點被按住,松開其中一個點時觸發(即非最後一個點被放開時)。
該方法用來擷取一個模拟事件,參數意義為:】
參數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:手勢事件的标記
模拟一個MotionEvent對象,這裡我們使用MotionEvent的obtain()方法,參數如下
在螢幕中間模拟一次ACTION_DOWN事件
另外你要模拟滑動事件則模拟成MotionEvent.ACTION_MOVE即可
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坐标