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