2017-07-29 96 views
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; 
} 

}

+0

可以使用getPointerCount方法通过使用索引号得到各界指针数和工作。 –

+0

这个doumentation应该可以帮到你.. https://developer.android.com/reference/android/view/MotionEvent.html –

回答

0

我认为这个问题是引入方法。 从我能告诉pointerList是一个Map使用指针ID作为关键。 在绘制方法中,您试图让所有指针的密钥在范围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()); 
    } 
} 
+0

谢谢。但它没有解决多圈拖动的问题 – Nabin