2013-12-18 44 views
0

我嘗試修復在我的應用程序中添加多點觸控功能時出現在代碼中的問題。 這個問題似乎來自ACTION_POINTER_DOWN:多點觸控 - 指針超出範圍

private float oldDist = 0; 
backCard.setOnTouchListener(new OnTouchListener() { 
@Override 
     public boolean onTouch(View v, MotionEvent me) { 

      switch(me.getAction()){ 
      case MotionEvent.ACTION_DOWN: 
        firstX = (int) me.getX(); 
      case MotionEvent.ACTION_POINTER_DOWN: 
       if(me.getPointerCount() >= 2){ 
        oldDist = getSpacing(me); 
        System.out.println(oldDist); 
       }      
       break; 
      case MotionEvent.ACTION_MOVE: 
        float newDist = getSpacing(me); 
        if(newDist - oldDist > 200 && oldDist != 0){ 
         System.out.println("Enabled"); 
        } 
       break; 
      case MotionEvent.ACTION_UP:   
      case MotionEvent.ACTION_POINTER_UP: 
       break; 
      } 
      return true; 

     } 
private float getSpacing(MotionEvent me){ 
      float difx = me.getX(0) - me.getX(1); 
      float dify = me.getY(0) - me.getY(1); 
      float spacing = (float) Math.sqrt(difx*difx + dify*dify); 
      return spacing; 
     } 
}); 

當我使用它沒有在ACTION_POINTER_DOWN的getPointerCount()條件,我有一個超出範圍的錯誤。但是,如果我使用條件,日誌不顯示任何我打印在代碼中。 (當然,我使用2個手指!:)),因此即使多個手指同時觸摸屏幕,情況也不會如此。

我該如何解決這個問題?謝謝。

我的設備是GS3。

+1

我不認爲ACTION_DOWN對所有手指交付一次。你幾乎不可能在相同的時刻,在幾毫秒內完全掌握你的手指。我建議你關注ACTION_MOVE。 – 323go

回答

1

使用me.getActionMasked()而不是me.getAction()

+0

謝謝你快速回答,這完美的作品! ;)但我試圖在網站的其他答案中瞭解getAction和getActionMasked之間的區別是什麼,但仍然懷疑。你能解釋我嗎?再次感謝你。 – mickaelb91

+0

沒問題:) getAction()將返回與所涉及的指針有關的任何信息發生的操作。 getActionMasked()掩蓋了指針信息並只返回發生的操作;它與'getAction()&MotionEvent.ACTION_MASK'類似。此外,getAction()只會給你ACTION_DOWN等,但從來沒有像ACTION_POINTER_DOWN這樣的指針副本,這就是爲什麼它第一次沒有if語句的原因,因爲case-fall-through,但不是第二次使用它:) – Badgerati