2016-05-31 3 views
1

내 데스크탑 게임을 안드로이드로 포팅 할 수 있도록 포인터의 목록과 화면상의 위치 (픽셀 단위)를 얻으려고합니다. 이렇게하려면이 onTouch 핸들러를 작성했습니다.Android 멀티 터치 - TouchMove 이벤트의 IllegalArgumentException

private boolean onTouch(View v, MotionEvent e) 
{ 
    final int action = e.getActionMasked(); 

    switch (action) 
    { 
     case MotionEvent.ACTION_DOWN: 
      surfaceView.queueEvent(() -> postTouchEvent(FINGER_0, true, e.getX(), e.getY())); 
      break; 

     case MotionEvent.ACTION_UP: 
      surfaceView.queueEvent(() -> postTouchEvent(FINGER_0, false, e.getX(), e.getY())); 
      break; 

     case MotionEvent.ACTION_POINTER_DOWN: 
     case MotionEvent.ACTION_POINTER_UP: 
     { 
      final int index = e.getActionIndex(); 
      final int finger = index + 1; 

      if (finger < FINGER_1 || finger > FINGER_9) 
       break; 

      final boolean isDown = action == MotionEvent.ACTION_POINTER_DOWN; 
      surfaceView.queueEvent(() -> postTouchEvent(finger, isDown, e.getX(), e.getY())); 
     } 
     break; 

     case MotionEvent.ACTION_MOVE: 
      for (int i = 0; i < e.getPointerCount(); i++) 
      { 
       final int finger = i + 1; 

       if (finger < FINGER_0 || finger > FINGER_9) 
        break; 

       surfaceView.queueEvent(() -> 
         postTouchEvent(finger, true, e.getX(finger - 1), e.getY(finger - 1))); 
      } 
      for (int i = e.getPointerCount(); i < FINGER_9; i++) 
      { 
       final int finger = i + 1; 
       surfaceView.queueEvent(() -> postTouchEvent(finger, false, 0, 0)); 
      } 
      break; 
    } 

    return true; 
} 

문제가 ACTION_MOVE 이벤트와 함께하지만, 난 내 인덱스 아이디의 액세스하기위한 IllegalArgumentException을 얻고있다. 이것은 한 번에 화면에 3 개 이상의 손가락을 가볍게 두드리는 경우에만 발생하지만 여전히 문제가됩니다. 예외는 다음과 같습니다.

FATAL EXCEPTION: GLThread 61026 
Process: com.shc.silenceengine.tests.android, PID: 23077 
java.lang.IllegalArgumentException: pointerIndex out of range 
    at android.view.MotionEvent.nativeGetAxisValue(Native Method) 
    at android.view.MotionEvent.getX(MotionEvent.java:2014) 
    at com.shc.silenceengine.backend.android.AndroidInputDevice.lambda$onTouch$14(AndroidInputDevice.java:228) 
    at com.shc.silenceengine.backend.android.AndroidInputDevice.access$lambda$6(AndroidInputDevice.java) 
    at com.shc.silenceengine.backend.android.AndroidInputDevice$$Lambda$7.run(Unknown Source) 
    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1462) 
    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239) 

나는 나는 단지 e.getPointerCount()까지 for 루프하고 있어요 때문에 내가 그렇게 코드의 외출 인덱스의 기회가없는 오류를 받고 있어요 이유를 모르겠어요.

포인터 ID를 추적하고 싶지 않습니다. 포인터의 원시 목록을 원하고 이러한 이벤트가 내 엔진 목록에서 다음 프레임을 구성합니다.

누구든지 문제가있는 부분을 지적 할 수 있습니까?

답변

1
별도 (이상) 스레드에서 e.getX()e.getY()를 호출

-는 MotionEvent 객체의 내부 상태가 스레드의 onTouch() 콜백과 실행 사이의 변경 가능성이 높습니다.

에서만 MotionEvent 객체가 onTouch() 방법 중 유효 가정 전에 스레드 에 메소드 종료를 전달하는 getX()getY()에 대한 값을 검색합니다.

+0

바로! 이것을 지적 해 주셔서 감사합니다. –