java - Android MultiTouch 抬起手指时崩溃

标签 java android multi-touch

我不想编写动态壁纸,并且我需要当前按下的点的列表。我将点存储在 SpareArray 中(基本上与 HashMap 相同,但速度更快)。

现在,当我用两根手指(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)

最佳答案

我相信您希望调用 event.getX(i) 而不是 event.getX(pID)。 getPointerId(i) 返回一个指针标识符,而不是指针的索引,这正是您想要的。

有关此内容的更多信息可以在 MotionEvent docs 中找到。

关于java - Android MultiTouch 抬起手指时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11509732/

相关文章:

java - 如何遍历 csv 文件并从中创建 2 元组的映射?

java - 如何使用 java servlet 保护 HttpSession 中的 session 变量

android - wifi 关闭时不显示 GoogleMap v2

android - 从哪里获得 Drive API v2 和依赖项的 Android 库(首选 Maven)?

iphone - 有什么方法可以确定触摸运动的速度

java - 两个相等的组合键不会到达同一个 reducer

java - ArrayAdapter在构建抽屉导航中的作用是什么

javascript - 使用 Hammer.js 和触摸模拟器的捏合事件

ios - 如何在 touchesBegan : and touchesEnded:? 之间以一致的方式跟踪触摸

java - 如何将java中带有1和0的字符串转换为相应的ASCII值?