Android 手機產生觸控動作時,在Activity裏面會觸發 onTouchEvent(event: MotionEvent) 這隻函式, 只要覆寫該程式, 並利用 event 的一些成員就可操作整個觸控螢幕, 為了減少累綴物件程式碼, 可以利用 with(event}{when(actionMasked){ }} 將操控成員放在區域塊(scope)內操作.以下列出 MotionEvent 重要成員:
pointerCount :螢幕觸控點累積的數量
actionIndex :觸發動作的索引鍵(index), 0是第 1 個 UP 點, pointerCount - 1 是最後一點
actionMasked :觸控動作遮罩用來判斷觸控點的動作, 共有以下 6 個工作狀態:
MotionEvent.ACTION_CANCEL : 觸控動作被取消了
MotionEvent.ACTION_DOWN :手指按壓觸控螢幕後, 當下 pointerCount==1 時觸發
MotionEvent.ACTION_POINTER_DOWN :當手指按壓螢幕後, pointerCount>1 時觸發
MotionEvent.ACTION_UP :手指離開觸控螢幕時, 當下 pointerCount==1 時觸發
MotionEvent.ACTION_POINTER_UP :當手指離開螢幕時, pointerCount>1 觸發
MotionEvent.ACTION_MOVE:只要有手指在螢幕上移動就觸發,此時actionIndex固定是 0,似乎是固定追蹤第一個 UP 的觸控點, 當pointerCount > 1 時, 額外觸控點座標就要限縮索引值後再去讀取: for(p in 1 until pointerCount) { getPointerId(p); getX(p) ; getY(p); ... } 而每個觸控點 id 透過 getPointerId(索引值) 加以區分, 其他常用的成員函數還有:
getX(index): 取得索引觸控點的X(橫)軸座標值
getY(index): 取得索引觸發點的Y(縱)軸座標值
getPointerId(index): 取得索引觸發點的唯一序號(id)
findPointerIndex(id): 取得觸發點唯一序號所對應的索引鍵
// Kotlin 程式碼: activity.kt ...
override fun onTouchEvent(event: MotionEvent): Boolean {
return with(event){
val index = actionIndex
val id = getPointerId(index)
var motion = "(" + getX(index).toInt() + "," + getY(index).toInt() + ")#" + id +"#\n"
motion += "[index=" + index + "]/"+ pointerCount+ "\n"
when(actionMasked) {
MotionEvent.ACTION_CANCEL -> motion +=":CANCEL"
MotionEvent.ACTION_DOWN -> motion +=":DOWN"
MotionEvent.ACTION_POINTER_DOWN -> motion +=":POINT DOWN"
MotionEvent.ACTION_UP -> motion +=":UP"
MotionEvent.ACTION_POINTER_UP -> motion +=":POINT UP"
MotionEvent.ACTION_MOVE -> {
motion +=":MOVE\n"
for(x in 1 until pointerCount) motion += "(" + getX(x).toInt() + "," + getY(x).toInt() + ")" +"#" + getPointerId(x) +"#\n"
}
}
Toast.makeText(applicationContext, motion, LENGTH_SHORT).show()
return true
}
}
沒有留言:
張貼留言