2016-11-29 9 views
0

現在、私はonTouchEventメソッドをオーバーライドしてAndroidのマルチタッチを実装するゲームに取り組んでいます。その中で私はすべてのポインタの上に行くforループを持っています。しかし、時にはACTION_POINTER_UPに正しく動作しないため、IllegalArgumentExceptionがスローされます。私はそれを捕まえてループを続けようとしましたが、時にはうまく動作せず、不安定な動作を表示します。 IllegalArgumentExceptionがスローされたときに、ループポインタがアクティブポインタでもなく、ポインタの総数に等しいかそれ以上でないことを確認するためにデバッグしました。参考までに私のコードがあります。 AndroidマルチタッチACTION_POINTER_UP MotionEvent.getX IllegalArgumentException

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (event.getActionMasked() == MotionEvent.ACTION_MOVE) { 
      return true; 
     } 
     if (event.getActionMasked() == MotionEvent.ACTION_CANCEL) { 
      return false; 
     } 
     boolean notUp = true; 
     int pointerCount = event.getPointerCount(); 
     boolean p1Turned = false; 
     boolean p2Turned = false; 
     for (int i = 0; i < pointerCount; ++i) { 
      float x, y; 
      if (event.getActionMasked() == MotionEvent.ACTION_POINTER_UP && event.getActionIndex() == i){ 
       notUp = false; 
       continue; 
      } 
      try { 
       x = event.getX(event.getPointerId(i)); 
       y = D.height - event.getY(event.getPointerId(i)); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
       continue; 
      } 
      //test if the pointer is touching a button 
      if (x >= buttons[0] && x <= buttons[6] && y <= buttons[1] && y >= buttons[7]) { 
       p1.turnLeft(); 
       p1Turned = true; 
      } else if (x >= buttons[12] && x <= buttons[12 + 6] && y <= buttons[12 + 1] && y >= buttons[12 + 7]) { 
       p1.turnRight(); 
       p1Turned = true; 
      } else if (x >= buttons[24] && x <= buttons[24 + 6] && y <= buttons[24 + 1] && y >= buttons[24 + 7]) { 
       p2.turnLeft(); 
       p2Turned = true; 
      } else if (x >= buttons[36] && x <= buttons[36 + 6] && y <= buttons[36 + 1] && y >= buttons[36 + 7]) { 
       p2.turnRight(); 
       p2Turned = true; 
      } 
     } 
     if (!p1Turned) { 
      p1.stopTurning(); 
     } 
     if (!p2Turned) { 
      p2.stopTurning(); 
     } 
     if (event.getActionMasked() == MotionEvent.ACTION_UP){ 
      p1.stopTurning(); 
      p2.stopTurning(); 
     } 
     return notUp; 
    } 

グリッチが、それは常にACTION_POINTER_UPだとデバッグを通じて、私は問題がevent.getActionIndex() iが= 1とevent.getX(event.getPointerId(i))はそれがIllegalArgumentExceptionをスロー呼び出されたときしかし、常に0で発生したときに発見し、ループが二時間をかけてスキップされますが発生

。この状況が発生すると、アクティブなポインタの数は常に2になるので、forブロックのコードは呼び出されません。

この状況に関する助けがあれば幸いです。

答えて

関連する問題