pointerIndex 超出范围 Android 多点触控

新手上路,请多包涵

我有一个触摸事件异常导致我的游戏在平板电脑(或更具体地说,蜂巢)上崩溃…我的游戏在我的手机上运行良好,我还没有听说任何未运行 Android 3.0 的人会发生这种情况或更高。这是相关的日志信息…

 E/AndroidRuntime(26487): java.lang.IllegalArgumentException: pointerIndex out of range
E/AndroidRuntime(26487):    at android.view.MotionEvent.nativeGetAxisValue(Native Method)
E/AndroidRuntime(26487):    at android.view.MotionEvent.getX(MotionEvent.java:1549)
E/AndroidRuntime(26487):    at kieran.android.asteroids.GameUI.onTouchEvent(GameUI.java:665)
E/AndroidRuntime(26487):    at android.view.View.dispatchTouchEvent(View.java:4616)
E/AndroidRuntime(26487):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
E/AndroidRuntime(26487):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
E/AndroidRuntime(26487):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
E/AndroidRuntime(26487):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
E/AndroidRuntime(26487):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
E/AndroidRuntime(26487):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)

… 这是调用它的代码。对我来说似乎很好,但也许蜂窝中有一个尚未修复的错误?上面日志中的行号 665 对应于 float x = event.getX(id); 行。它一定与我获取 which 变量的方式有关?但它在 phones/2.3 及更低版本上运行良好…

 int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;

if(actionCode == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_UP) {
    int which = action >> MotionEvent.ACTION_POINTER_ID_SHIFT;
    int id = event.getPointerId(which);
    float x = event.getX(id);
    float y = event.getY(id);

任何帮助/想法将不胜感激,因为我正试图让平板电脑用户也可以使用我的游戏。谢谢。

原文由 DRiFTy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 835
2 个回答

我的问题是当实际上没有两个 id 时它实际上是在调用 event.getX(1) 。所以我确保有两个 event.getPointerCount() >= 2 的 id,它现在可以工作了。也许你会有同样的运气!

原文由 Millec8 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于那些仍在寻找答案的人,请注意,当您使用任何带有图像 缩放缩放 功能的 ViewPager 等时,也可能会发生这种情况。那么您也有可能获得此异常。

解决方案

扩展 现有的 ViewPager 并使用 try catch 覆盖这些方法。

 @Override
public boolean onTouchEvent(MotionEvent ev) {
    try {
        return super.onTouchEvent(ev);
    } catch (IllegalArgumentException ex) {
        ex.printStackTrace();
    }
    return false;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    try {
        return super.onInterceptTouchEvent(ev);
    } catch (IllegalArgumentException ex) {
        ex.printStackTrace();
    }
    return false;
}

原文由 vikas kumar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题