演示效果
-
demo實(shí)現(xiàn)第一腔寡、二個(gè)觸控點(diǎn)的坐標(biāo)記錄及繪制展示
e47k6-a128q.gif
多點(diǎn)觸控操作判斷的值
名稱 | 簡(jiǎn)介 |
---|---|
pointerId |
該值從按下到抬起是固定的表箭,用于判斷具體的觸控點(diǎn),通過(guò)getPointerId(int pointerIndex) 方法獲得 |
pointerIndex |
該值相當(dāng)于數(shù)組中的下標(biāo)今野,多個(gè)點(diǎn)按下時(shí),抬起點(diǎn)之后的pointerIndex 值會(huì)重置罐农,用于獲取多點(diǎn)的坐標(biāo)等值条霜,ACTION_DOWN 、ACTION_UP 涵亏、ACTION_POINTER_DOWN 宰睡、ACTION_POINTER_UP 事件中可通過(guò)getActionIndex() 方法獲得,也可通過(guò)findPointerIndex(int pointerId) 方法獲得 |
關(guān)鍵代碼
//第一個(gè)點(diǎn)的坐標(biāo)
private Point mPointer1;
//第二個(gè)點(diǎn)的坐標(biāo)
private Point mPointer2;
@Override
protected void onDraw(Canvas canvas) {
//第一個(gè)點(diǎn)不為空則在坐標(biāo)位置畫(huà)一個(gè)紅色的圓
if (mPointer1 != null) {
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawCircle(mPointer1.x, mPointer1.y, 100, paint);
}
//第二個(gè)點(diǎn)不為空則在坐標(biāo)位置畫(huà)一個(gè)黃色的圓
if (mPointer2 != null) {
Paint paint = new Paint();
paint.setColor(Color.YELLOW);
canvas.drawCircle(mPointer2.x, mPointer2.y, 100, paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int pointerId = event.getPointerId(event.getActionIndex());
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
// 處理按下事件 第一個(gè)點(diǎn)按下時(shí)會(huì)觸發(fā)
handleTouchDown(event, pointerId);
break;
case MotionEvent.ACTION_UP:
// 處理抬起事件 最后一個(gè)點(diǎn)抬起時(shí)會(huì)觸發(fā)气筋,抬起后將點(diǎn)都置為null
mPointer1 = null;
mPointer2 = null;
break;
case MotionEvent.ACTION_POINTER_DOWN:
// 處理按下事件 非第一個(gè)點(diǎn)按下時(shí)會(huì)觸發(fā)
handleTouchDown(event, pointerId);
break;
case MotionEvent.ACTION_POINTER_UP:
// 處理抬起事件 非最后一個(gè)點(diǎn)抬起時(shí)會(huì)觸發(fā)
handleTouchUp(pointerId);
break;
case MotionEvent.ACTION_CANCEL:
// 事件取消時(shí)會(huì)被觸發(fā)
handleTouchUp(pointerId);
break;
case MotionEvent.ACTION_MOVE:
// 觸控滑動(dòng)時(shí)觸發(fā)
handleTouchMove(event);
break;
}
// 重新繪制
invalidate();
return true;
}
private void handleTouchMove(MotionEvent event) {
int pointerId;
// Move事件無(wú)法直接獲得pointerIndex 直接通過(guò)遍歷獲得
int count = event.getPointerCount();
for (int i = 0; i < count; i++) {
// 通過(guò)pointerIndex 獲得pointerId
pointerId = event.getPointerId(i);
// 通過(guò)pointerId 判斷是哪個(gè)點(diǎn)
switch (pointerId) {
case 0:
mPointer1.set((int) event.getX(i), (int) event.getY(i));
break;
case 1:
mPointer2.set((int) event.getX(i), (int) event.getY(i));
break;
}
}
}
private void handleTouchUp(int pointerId) {
//判斷抬起的點(diǎn) 清楚記錄數(shù)據(jù)
switch (pointerId) {
case 0:
mPointer1 = null;
break;
case 1:
mPointer2 = null;
break;
}
}
private void handleTouchDown(MotionEvent event, int pointerId) {
int pointerIndex = event.findPointerIndex(pointerId);
//判斷按下的點(diǎn) 記錄相應(yīng)的點(diǎn)
switch (pointerId) {
case 0:
mPointer1 = new Point((int) event.getX(pointerIndex), (int) event.getY(pointerIndex));
break;
case 1:
mPointer2 = new Point((int) event.getX(pointerIndex), (int) event.getY(pointerIndex));
break;
}
}