2017-07-29 89 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