Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 指针索引超出范围Android多点触摸_Java_Android_Exception_Multi Touch - Fatal编程技术网

Java 指针索引超出范围Android多点触摸

Java 指针索引超出范围Android多点触摸,java,android,exception,multi-touch,Java,Android,Exception,Multi Touch,我有一个触摸事件异常,导致我的游戏在平板电脑上崩溃(或者更具体地说,是蜂巢)。。。我的游戏在我的手机上运行得很好,我从来没有听说过这种情况发生在没有运行安卓3.0或更高版本的人身上。这里是相关的日志信息 E/AndroidRuntime(26487): java.lang.IllegalArgumentException: pointerIndex out of range E/AndroidRuntime(26487): at android.view.MotionEvent.nativ

我有一个触摸事件异常,导致我的游戏在平板电脑上崩溃(或者更具体地说,是蜂巢)。。。我的游戏在我的手机上运行得很好,我从来没有听说过这种情况发生在没有运行安卓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)
。。。这是调用它的代码。对我来说似乎很好,但可能蜂巢中有一个尚未修复的bug?上面日志中的行号665对应于
float x=event.getX(id)行。这一定与我获取
变量的方式有关,可能是哪个
变量?但它在手机/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);

在我尝试让平板电脑用户也能使用我的游戏时,任何帮助/想法都将不胜感激。谢谢。

您缺少一些东西,您需要将掩码应用到指针上,否则,从技术上讲,您无法访问您认为是的手指ID

int action = event.getAction() & MotionEvent.ACTION_MASK;     
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
int pointerId = event.getPointerId(pointerIndex);

只需将您的
getPointerId()
更改为
findPointerIndex()
。可能将
geAction()
更改为
getActionMasked()


希望有帮助

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

我也有这个错误,但在我的后期工作日期之前没有解决方案。唯一对我有效的临时伪修复方法是对非法argumentexception使用try catch


根据Android的说法,它与ScaleGetDetector有关,几天前已经提交了一个修复程序。

当getX和getY使用指针索引时,原始发布使用指针id

当您将ID用于单次触摸时,它似乎起作用,因为ID和索引均为0。如果您使用多点触摸,它会一团糟,因为索引可能会改变

例如:

按下1。
触摸1状态索引=0。ID=0

触摸2下。
触摸1状态索引=0。ID=0
触摸2状态索引=1。ID=1

触摸1释放。
触摸2状态索引=0。ID=1

请尝试以下代码:

final int action = e.getAction();       
final int pointerIndex =(action & MotionEvent.ACTION_POINTER_INDEX_MASK) 
                >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;      
float x = event.getX(pointerIndex);
float y = event.getY(pointerIndex);

对于仍在寻找答案的用户,请注意,当您使用任何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;
}

嗯。。。我明白你的意思。虽然改变了它,我仍然得到同样的错误。错误来自getX()方法。在传递到该函数之前,我记录了指针索引,它通常只是一个正的1、2或3等等,这取决于它是哪个指针。还有其他想法吗?您现在正在使用event.getX(pointerIndex)吗?getY可能也在做同样的事情,只是在代码中没有走那么远。当你触摸屏幕时会崩溃吗?如果是这样的话,需要多少次触碰才能打破它?这个代码在哪里被调用?是的,我现在正在使用event.getX(pointerIndex),是的,我肯定getY()也会这样做,但它显然在那之前崩溃了。需要两次触球才能打破它,我放下一个指针,再放下第二个指针,然后第一个指针向上,它就崩溃了。是的,就在onTouchEvent()中。我不太理解它,因为它在我的手机上工作,但在我的平板电脑上不工作。在调试中运行,看看pointerIndex和pointerID的值在CrashDamnn停止之前返回什么。。。我对这项工作寄予厚望。很难相信我还没有找到解决这个问题的办法,我不可能是唯一一个有这个问题的人。我尝试了很多东西…我使用findPointerIndex()getActionMasked(),但仍然在多点触摸中崩溃。你太棒了!这正是我的问题。我仍然不确定为什么我在手机上没有这个问题,但现在这已经解决了我的强制关闭问题。谢谢!这是最好的解决方案!使用David和Chris建议的指针索引计算将阻止三星Note 2的放大和缩小我运气不好,我在onInterceptTouchEvent中应用了ev.getPointerCount()>10,但它仍然崩溃是的,我在蜂窝上的问题与我的迷你钢琴完全相同。在手机上,它只是表现正常。完美的解决方案我也使用ScaleGetureDetector。但是,即使这个bug已经修复,我们如何将这个解决方案移植到我们的构建中呢?你太棒了!这正是我的问题。