2012-11-28 1 views
1

처음에는 그곳에 관한 게시물이 두 개 이상 있지만 버그/실수를 수정하는 데 도움이되지 않았습니다. 미안하다. 재 게시와 너희들이이 버그를 없애기를 바란다면.pointerIndex 범위를 벗어난 멀티 터치

11-28 17:36:36.110: W/dalvikvm(8380): threadid=1: thread exiting with uncaught exception (group=0x40a331f8) 
11-28 17:36:36.110: E/AndroidRuntime(8380): FATAL EXCEPTION: main 
11-28 17:36:36.110: E/AndroidRuntime(8380): java.lang.IllegalArgumentException: pointerIndex out of range 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.MotionEvent.nativeGetAxisValue(Native Method) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.MotionEvent.getX(MotionEvent.java:1974) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at com.main.TouchEventControler.processJoyPadTouchRelease(TouchEventControler.java:194) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at com.main.TouchEventControler.processRelease(TouchEventControler.java:237) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at com.main.TouchEventControler.processTouchEvent(TouchEventControler.java:88) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at com.main.GameField.onTouchEvent(GameField.java:142) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.View.dispatchTouchEvent(View.java:5546) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1938) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1375) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.app.Activity.dispatchTouchEvent(Activity.java:2364) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1886) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.View.dispatchPointerEvent(View.java:5726) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2890) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2466) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:845) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2475) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.os.Looper.loop(Looper.java:137) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at java.lang.reflect.Method.invoke(Method.java:511) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
11-28 17:36:36.110: E/AndroidRuntime(8380):  at dalvik.system.NativeStart.main(Native Method) 

나는 이런 식으로 그들을 처리 할 그리고 난 그것이 때때로 그 오류로 충돌을 해달라고하면 내가 원하는처럼 실행되는 행복 : 그 스위치에 호출 methodes에서

public void processTouchEvent(MotionEvent event) { 

    // create an action 
    int action = (event.getActionMasked() & MotionEvent.ACTION_MASK); 
    // getting pointerindex 
    int pointerIndex = ((event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT); 
    // getting pointer id 

    //catch invalide 
    if(pointerIndex == MotionEvent.INVALID_POINTER_ID){ 
     return; 
    } 

    int pointerId = event.findPointerIndex(pointerIndex); 
    // switch case for the action 
    switch (action) { 
    case MotionEvent.ACTION_DOWN: // if action down 
     processHitButtonTouch(event, pointerId); 
     processJoyPadTouch(event, pointerId); 
     break; 
    case MotionEvent.ACTION_POINTER_DOWN: // if pointer down (second 
              // finger/third) 
     processHitButtonTouch(event, pointerId); 
     processJoyPadTouch(event, pointerId); 
     break; 
    case MotionEvent.ACTION_UP: // if action up 
     processRelease(event, pointerId); 
    case MotionEvent.ACTION_POINTER_UP: // if action up second/third finger 
     processRelease(event, pointerId); 
    default: 
     break; 
    } 
} 

을 나는 단지 접촉의 위치를 ​​얻고 그들을 취급하십시오. 난 그냥 getX (pointerIndex) 잡을 수 try 및 해당 오류가 반환하십시오. 그러나 거기에 더 좋은 방법이 있습니까?!

내가 이미 가지고있는 모든 도움을 주셔서 감사합니다.

public void processJoyPadTouchRelease(MotionEvent event, int pointerId) { 
    int touchPosX = (int) event.getX(pointerId); 
    int touchPosY = (int) event.getY(pointerId); 

    if ((//dont freak out here! it's just looking for if the 
      //touch was inside the Joypad! Nothing more!! 
      //it's in breckets! 
      touchPosX > 2 * Config.BLOCKSIZE 
      && touchPosX < 4 * Config.BLOCKSIZE 
      && touchPosY > 3 * Config.BLOCKSIZE 
      && touchPosY < 5 * Config.BLOCKSIZE 
      // touch up event handled 
      || 2 * Config.BLOCKSIZE < touchPosX 
      && touchPosX < (Config.BLOCKSIZE * 4) 
      && touchPosY > (7 * Config.BLOCKSIZE) 
      && touchPosY < (9 * Config.BLOCKSIZE) 
      // touch down handled 
      || (touchPosX < 2 * Config.BLOCKSIZE 
      && touchPosY > (5 * Config.BLOCKSIZE) 
      && touchPosY < (7 * Config.BLOCKSIZE)) 
      // touch left handled 
      || (4 * Config.BLOCKSIZE < touchPosX 
      && touchPosX < (Config.BLOCKSIZE * 6) 
      && touchPosY > (5 * Config.BLOCKSIZE) 
      && touchPosY < 7 * Config.BLOCKSIZE)) 
      //touch right handled 

      //and the char isnt idle (so it's moving) 
     && charac.getStatus() != Status.IDLE) 
    //THAN do =>> 
    { 
     charac.setStatus(Status.IDLE); 
     joyPad.status = Status.IDLE; 
    } 
} 
+0

오류를 던지고있는 크기의 크기()와 비교하고 크기가 너무 크지 않은지 확인하십시오. – codeMagic

답변

4

봅니다 확인하십시오 pointerIndex < event.getPointerCount();

수 있도록하지만 난 아마 여기에 오해가 있다고 생각 :

가에 대한 질문. 코드의 pointerIndex는 변경된 포인터의 인덱스이므로 ACTION_POINTER_DOWN 및 ACTION_POINTER_UP에서만 사용해야합니다. 화면에 손가락이 하나 밖에 없으면 여기에서 pointerIndex가 유효하지 않습니다.

+0

글쎄 실제로 2 손가락으로 작동하지만 때로는 그 코드와 충돌합니다. 하지만 정말 빨리 만지는 경우에만이 작업을 수행합니다. 네가 말한 사건에 대해 if를 추가했다. – BennX

+0

processJoyPadTouchRelease() 코드를 게시하십시오. – faylon

+0

코드를 추가했습니다. 그것은 ID를 통해 첫 번째 터치 이벤트를 얻을 수 있기 때문에 정상적으로 작동해야합니다. logcat – BennX