2012-07-16 56 views
2

我不想編碼動態壁紙,我需要一個當前按下的點的列表。我將這些點存儲在SpareArray中(基本上與HashMap相同,但速度更快)。Android MultiTouch在擡起手指時崩潰

現在,當我用兩根手指(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',你應該張貼您的日誌,而不是'Exception'的唯一名字。你的日誌將指向一個特定的代碼行,它最終會對你和任何試圖幫助你的人有用。 – adneal 2012-07-16 17:51:20

+0

對不起,我編輯了我的帖子,但是行標記了(向右滾動) – teamalpha5441 2012-07-16 17:57:17

回答

2

我相信你想要撥打event.getX(i)而不是event.getX(pID)。 getPointerId(i)返回一個指針標識符,而不是指針的索引,這是你想要的。

關於這方面更多的信息可以在MotionEvent docs

+0

謝謝,你真的救了我一天:) – teamalpha5441 2012-07-16 18:03:22