moveImage.setOnTouchListener(mOnTouchListener)
val mOnTouchListener = object : View.OnTouchListener {
    override fun onTouch(view: View?, event: MotionEvent?): Boolean {
        when (event!!.action and MotionEvent.ACTION_MASK) {
            //設置事件
        //通知 ViewGroup 要接收此事件,事件將不往下傳遞
        return true 

MotionEvent

MotionEvent.action:

ACTION_DOWN : 第一根手指按下時觸發

ACTION_POINTER_DOWN : 第二、三、四…等等的手指按下時觸發

ACTION_MOVE : 螢幕上觸控點滑動時觸發

ACTION_POINTER_UP : 在螢幕剩一個觸控點之前,手指離開螢幕時觸發

ACTION_UP : 最後一根手指離開螢幕時觸發

#目前測試發現,三指同時按下時,event.pointerCount 會為 2,
 且無論手指依序或同時起來,ACTION_POINTER_UP 及 ACTION_UP 皆
 不會觸發,這部分仍待了解原因

val mOnTouchListener = object : View.OnTouchListener { override fun onTouch(view: View?, event: MotionEvent?): Boolean { when (event!!.action and MotionEvent.ACTION_MASK) { ACTION_DOWN -> { mode = MODE_MOVE } ACTION_POINTER_DOWN -> { if (event.pointerCount <= 2) { //兩指皆在View內才觸發 if(判斷觸控點是否在 View 內的條件){ mode = MODE_ZOOM } else mode = MODE_NONE ACTION_POINTER_UP -> { mode = MODE_NONE } return true

目標:找出新位置的 view.x 及 view.y 並設置

ACTION_DOWN 時先將要扣掉的長度存進變數

ACTION_MOVE 時設定新的 view.x 及 view.y

Code:

ACTION_DOWN -> {
    xToSub = event.raxX - view.x
    yToSub = event.raxY - view.y
ACTION_MOVE -> {
    view!!.x = event.rawX - xToSub
    view.y = event.rawY - yToSub

避免 View 跑出畫面回不來

自定義期望的拖曳邊界

ACTION_UP 時,用 view 當前的上下左右判斷是否跑出邊界

若超出邊界,則重新設置 view.x 及 view.y