1、體驗(yàn)與發(fā)現(xiàn)
首先看一下代碼:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "viewSizeHandle: down"+event.getActionIndex());
break;
case MotionEvent.ACTION_POINTER_DOWN:
Log.i(TAG, "viewSizeHandle: point down"+event.getActionIndex());
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
Log.i(TAG, "viewSizeHandle: up"+event.getActionIndex());
break;
case MotionEvent.ACTION_POINTER_UP:
Log.i(TAG, "viewSizeHandle: point up"+event.getActionIndex());
default:
break;
}
return true;
}
安卓多指觸控涉及的觸摸事件就只有四個(gè):ACTION_DOWN、ACTION_POINTER_DOWN、ACTION_UP、ACTION_POINTER_UP
ACTION_MOVE是不包含其中的,感覺(jué)有點(diǎn)坑
以下都是默認(rèn)在一次多指觸控過(guò)程中:
- ACTION_DOWN:觸控時(shí),總是第一個(gè)被觸發(fā),之后就不會(huì)再觸發(fā)
- ACTION_POINTER_DOWN:只要還有觸控點(diǎn)在屏幕上,之后手指下去都是之觸發(fā)這個(gè)事件
- ACTION_UP:觸控點(diǎn)離開(kāi)時(shí),僅當(dāng)最后一個(gè)觸控點(diǎn)消失時(shí)才會(huì)觸發(fā)
- ACTION_POINTER_UP:只要還有觸控點(diǎn)在屏幕上,每當(dāng)手指離開(kāi)都會(huì)觸發(fā)這個(gè)事件
- ACTION_MOVE:可以獲取按下觸控點(diǎn)的位置(getX和getY)

過(guò)程:手指1 down →手指2 down →手指3 down → 手指3 up → 手指2 up →手指1 up
可以看到,第一個(gè)下去的才會(huì)觸發(fā)ACTION_DOWN,最后一個(gè)起來(lái)才會(huì)觸發(fā)ACTION_UP
具體自己去體驗(yàn)吧,很簡(jiǎn)單的代碼,實(shí)驗(yàn)起來(lái)也很簡(jiǎn)單,在activity貼上代碼,慢慢點(diǎn)吧。
2、重要的方法
getPointerCount():返回觸控點(diǎn)總數(shù)
getActionMasked():用這個(gè)方法才能出現(xiàn)掩蓋多指觸控的事件
getActionIndex():屏幕上每個(gè)手指,都對(duì)應(yīng)一個(gè)index,返回觸發(fā)按下或抬起動(dòng)作的下標(biāo)index
getX (int pointerIndex): 獲取指定觸控點(diǎn)的X坐標(biāo)
getY (int pointerIndex) :獲取指定觸控點(diǎn)的Y坐標(biāo)
知道上面這些,就靠你自己發(fā)揮了,重點(diǎn)是,要記錄x,y和善用隨后一個(gè)才會(huì)出現(xiàn)的ACTION_UP
3、在ACTION_MOVE獲取位置信息
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "viewSizeHandle: down"+event.getActionIndex());
break;
case MotionEvent.ACTION_POINTER_DOWN:
Log.i(TAG, "viewSizeHandle: point down"+event.getActionIndex());
break;
case MotionEvent.ACTION_MOVE:
if(event.getPointerCount()==2){
Log.i(TAG, "onTouchEvent:0 x:"+event.getX(0)+" y:"+event.getY(0));
Log.i(TAG, "onTouchEvent:1 x:"+event.getX(1)+" y:"+event.getY(1));
}
break;
case MotionEvent.ACTION_UP:
Log.i(TAG, "viewSizeHandle: up"+event.getActionIndex());
break;
case MotionEvent.ACTION_POINTER_UP:
Log.i(TAG, "viewSizeHandle: point up"+event.getActionIndex());
default:
break;
}
return true;
}
只是在ACTION_MOVE獲取對(duì)應(yīng)的X和Y,那么你可以判斷觸控點(diǎn)的數(shù)量來(lái)實(shí)現(xiàn)邏輯,比如:
- 一個(gè)觸控點(diǎn),我們就直接認(rèn)為是簡(jiǎn)單的移動(dòng)事件,比如拖拽的邏輯等
- 兩個(gè)觸控點(diǎn),也許你會(huì)寫什么放大縮小的邏輯
- 三個(gè)觸控點(diǎn),這是三指切換應(yīng)用什么的
- 根據(jù)需要寫邏輯,以上知識(shí)舉例