跟踪多次触摸移动

时间:2017-07-29 17:22:33

标签: java android

我有一个自定义视图,用于检测用户触摸并在触摸屏幕时绘制一个圆圈。不同手指的不同圆圈。当用户移开手指时,圆圈被清除。现在我必须在移动手指的同时移动圆圈。 移动手指时我只能移动1个圆圈。如果我在屏幕上有超过1个手指,我该如何沿手指方向移动所有圆圈?

 public boolean onTouchEvent(MotionEvent event) {
    int pointerIndex = event.getActionIndex();
    int pointerId = event.getPointerId(pointerIndex);
    int maskedAction = event.getActionMasked();

    switch (maskedAction){
        case MotionEvent.ACTION_DOWN: {
            Pointers pointer = new Pointers();
            pointer.setX(event.getX(pointerIndex));
            pointer.setY(event.getY(pointerIndex));
            pointer.setPaint(getPaint());

            pointersList.put(pointerId,pointer);
            break;

        }
            case MotionEvent.ACTION_POINTER_DOWN: {
                Pointers pointer = new Pointers();
                pointer.setX(event.getX(pointerIndex));
                pointer.setY(event.getY(pointerIndex));
                pointer.setPaint(getPaint());
                pointersList.put(pointerId,pointer);
                break;
            }
            case MotionEvent.ACTION_MOVE:{
                int size = event.getPointerCount();
                    Pointers point = pointersList.get(pointerId);
                    if (point != null) {
                        point.setX(event.getX(pointerIndex));
                        point.setY(event.getY(pointerIndex));
                    }

            }
            break;
            case MotionEvent.ACTION_UP:{
                pointersList.remove(pointerId);

            }
                case MotionEvent.ACTION_POINTER_UP: {
                    pointersList.remove(pointerId);
                    break;
                }

        case MotionEvent.ACTION_CANCEL:{
            pointersList.remove(pointerId);
                        break;
                    }

    }
    invalidate();
    return true;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int size = pointersList.size();
    for(int i=0; i<size;i++){
        Pointers point = pointersList.get(i);
        if(point != null){
            canvas.drawCircle(point.getX(),point.getY(),SIZE,point.getPaint());
        }

    }
}

指针类

public class Pointers {
private float x,y;
private Paint paint;

public float getX() {
    return x;
}

public void setX(float x) {
    this.x = x;
}

public float getY() {
    return y;
}

public void setY(float y) {
    this.y = y;
}

public Paint getPaint() {
    return paint;
}

public void setPaint(Paint paint) {
    this.paint = paint;
}

}

1 个答案:

答案 0 :(得分:0)

我认为问题出在draw方法中。 据我所知,pointerListMap,它使用指针ID作为关键字。 在draw方法中,您尝试获取具有0total pointers - 1范围内的键的所有指针,这是不正确的。您试图通过索引获取指针,但它们是按ID存储的。

试试这个:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    for(Map.Entry<Integer, Pointers> entry : pointersList.entrySet()){
        Pointers point = entry.getValue();
        canvas.drawCircle(point.getX(),point.getY(),SIZE,point.getPaint());
    }
}