演示效果
-
demo实现第一、二个触控点的坐标记录及绘制展示
e47k6-a128q.gif
多点触控操作判断的值
名称 | 简介 |
---|---|
pointerId |
该值从按下到抬起是固定的,用于判断具体的触控点,通过getPointerId(int pointerIndex) 方法获得 |
pointerIndex |
该值相当于数组中的下标,多个点按下时,抬起点之后的pointerIndex 值会重置,用于获取多点的坐标等值,ACTION_DOWN 、ACTION_UP 、ACTION_POINTER_DOWN 、ACTION_POINTER_UP 事件中可通过getActionIndex() 方法获得,也可通过findPointerIndex(int pointerId) 方法获得 |
关键代码
//第一个点的坐标
private Point mPointer1;
//第二个点的坐标
private Point mPointer2;
@Override
protected void onDraw(Canvas canvas) {
//第一个点不为空则在坐标位置画一个红色的圆
if (mPointer1 != null) {
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawCircle(mPointer1.x, mPointer1.y, 100, paint);
}
//第二个点不为空则在坐标位置画一个黄色的圆
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:
// 处理按下事件 第一个点按下时会触发
handleTouchDown(event, pointerId);
break;
case MotionEvent.ACTION_UP:
// 处理抬起事件 最后一个点抬起时会触发,抬起后将点都置为null
mPointer1 = null;
mPointer2 = null;
break;
case MotionEvent.ACTION_POINTER_DOWN:
// 处理按下事件 非第一个点按下时会触发
handleTouchDown(event, pointerId);
break;
case MotionEvent.ACTION_POINTER_UP:
// 处理抬起事件 非最后一个点抬起时会触发
handleTouchUp(pointerId);
break;
case MotionEvent.ACTION_CANCEL:
// 事件取消时会被触发
handleTouchUp(pointerId);
break;
case MotionEvent.ACTION_MOVE:
// 触控滑动时触发
handleTouchMove(event);
break;
}
// 重新绘制
invalidate();
return true;
}
private void handleTouchMove(MotionEvent event) {
int pointerId;
// Move事件无法直接获得pointerIndex 直接通过遍历获得
int count = event.getPointerCount();
for (int i = 0; i < count; i++) {
// 通过pointerIndex 获得pointerId
pointerId = event.getPointerId(i);
// 通过pointerId 判断是哪个点
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) {
//判断抬起的点 清楚记录数据
switch (pointerId) {
case 0:
mPointer1 = null;
break;
case 1:
mPointer2 = null;
break;
}
}
private void handleTouchDown(MotionEvent event, int pointerId) {
int pointerIndex = event.findPointerIndex(pointerId);
//判断按下的点 记录相应的点
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;
}
}
网友评论