2012-07-16 1 views
2

라이브 배경 화면을 코딩 할 필요가 없으며 현재 눌려진 점 목록이 필요합니다. SpareArray (기본적으로 HashMap과 동일하지만 더 빠름)에 점을 저장합니다.손가락을 뺄 때 Android 멀티 터치 충돌이 발생합니다.

이제 두 손가락 (1과 2)으로 화면을 터치하고 손가락 (첫 손가락 2, 1)을 들어 올리면 작동합니다. 하지만 손가락 1을 먼저 들어 올리면 앱이 다운됩니다. 역순으로 손가락을 들어야 만합니다.

@Override 
public void onTouchEvent(MotionEvent event) { 
    for (int i = 0; i < event.getPointerCount(); i++) { 
     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
      case MotionEvent.ACTION_POINTER_DOWN: 
      case MotionEvent.ACTION_MOVE: 
       int pID = event.getPointerId(i); 
       Points.put(pID, new Point((int)event.getX(pID), (int)event.getY(pID))); //CRASH HERE 
       break; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_POINTER_UP: 
       Points.remove(event.getPointerId(i)); 
       break; 
     } 
    } 
    super.onTouchEvent(event); 
    handler.post(drawRunnable); 
} 

나는 항상 "java.lang.IllegalArgumentException가를 : pointerIndex 범위를 벗어"얻을 예외

감사합니다, 도미니크을

편집

: 스택 추적

07-16 19:55:58.354: E/AndroidRuntime(4986): FATAL EXCEPTION: main 
07-16 19:55:58.354: E/AndroidRuntime(4986): java.lang.IllegalArgumentException: pointerIndex out of range 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at android.view.MotionEvent.nativeGetAxisValue(Native Method) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at android.view.MotionEvent.getX(MotionEvent.java:1974) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at net.ta.livewp.LiveWallpaper$xEngine.onTouchEvent(LiveWallpaper.java:103) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:1047) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at android.os.Looper.loop(Looper.java:137) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at android.app.ActivityThread.main(ActivityThread.java:4575) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
07-16 19:55:58.354: E/AndroidRuntime(4986):  at dalvik.system.NativeStart.main(Native Method) 
+1

에서 찾을 수 있습니다, 당신은'Exception'의 이름 만이 아니라 로그를 게시해야한다. 로그는 그것이 던져지고있는 코드의 특정 라인을 가리키며, 이는 당신과 당신을 도우려는 사람들에게 유용합니다. – adneal

+0

미안하지만, 내 게시물을 편집했지만 줄을 표시 (오른쪽으로 스크롤) – teamalpha5441

답변

2

저는 믿습니다 당신이 event.getX(pID) 대신 event.getX(i)으로 전화하고 싶습니다. getPointerId (i)는 원하는 포인터 인 포인터 식별자를 반환합니다. 당신이 어떤 종류의`Exception`을 던지는하는 경우 이에 대한

상세 정보, 미래에서 MotionEvent docs

+0

덕분에, 정말 내 하루를 저장 :) – teamalpha5441