2019年6月18日 星期二

Android 使用 kotlin 語言讀取觸控螢幕訊息

 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
    }
}

沒有留言: