简体   繁体   English

跟踪多点触摸运动

[英]Tracking multiple touch movement

I have a custom view which detects user touch and draws a circle when screen is touched. 我有一个自定义视图,该视图可检测用户触摸并在触摸屏幕时画一个圆圈。 Different circles for different fingers.And circle is cleared when user removes the finger. 不同手指的不同圆圈。当用户移开手指时,圆圈将被清除。 Now i have to move the circle while moving the fingers. 现在我必须在移动手指的同时移动圆圈。 i can only move 1 circle while moving fingers. 我只能在移动手指的同时移动1圈。 IF i have more than 1 finger on screen, how can i move all the circle in the finger direction? 如果我的屏幕上有多个手指,如何在手指方向上移动所有圆圈?

 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());
        }

    }
}

Pointer Class 指针类

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;
}

} }

I think the problem is in the draw method. 我认为问题出在绘制方法上。 From what I can tell pointerList is a Map that uses the pointer ID as the key. 据我所知, pointerList是一个使用指针ID作为键的Map In the draw method you're trying to get all the pointer that have the key in the range 0 to total pointers - 1 which is incorrect. 在draw方法中,您尝试获取键范围在0total pointers - 1 ,这是不正确的。 You're trying to get the pointers by index but they were stored by ID. 您试图按索引获取指针,但它们是按ID存储的。

Try this: 尝试这个:

@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());
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM