Android Multi-Touch ACTION_POINTER_UP MotionEvent.getX IllegalArgumentException

时间:2016-11-29 09:32:44

标签: java android multi-touch ontouchevent motionevent

目前我正在开发一款通过覆盖onTouchEvent方法实现Android多点触控的游戏。在其中我有一个for循环遍历所有指针。但是,有时在ACTION_POINTER_UP上,这无法正常工作并抛出IllegalArgumentException。我试图抓住它并继续我的循环,但它有时不起作用并显示不稳定的行为。我已经调试以确保何时抛出IllegalArgumentException循环指针不是活动指针,也不是它大于或等于指针总数。这是我的代码供参考。

@Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getActionMasked() == MotionEvent.ACTION_MOVE) {
            return true;
        }
        if (event.getActionMasked() == MotionEvent.ACTION_CANCEL) {
            return false;
        }
        boolean notUp = true;
        int pointerCount = event.getPointerCount();
        boolean p1Turned = false;
        boolean p2Turned = false;
        for (int i = 0; i < pointerCount; ++i) {
            float x, y;
            if (event.getActionMasked() == MotionEvent.ACTION_POINTER_UP && event.getActionIndex() == i){
                notUp = false;
                continue;
            }
            try {
                x = event.getX(event.getPointerId(i));
                y = D.height - event.getY(event.getPointerId(i));
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
                continue;
            }
            //test if the pointer is touching a button
            if (x >= buttons[0] && x <= buttons[6] && y <= buttons[1] && y >= buttons[7]) {
                p1.turnLeft();
                p1Turned = true;
            } else if (x >= buttons[12] && x <= buttons[12 + 6] && y <= buttons[12 + 1] && y >= buttons[12 + 7]) {
                p1.turnRight();
                p1Turned = true;
            } else if (x >= buttons[24] && x <= buttons[24 + 6] && y <= buttons[24 + 1] && y >= buttons[24 + 7]) {
                p2.turnLeft();
                p2Turned = true;
            } else if (x >= buttons[36] && x <= buttons[36 + 6] && y <= buttons[36 + 1] && y >= buttons[36 + 7]) {
                p2.turnRight();
                p2Turned = true;
            }
        }
        if (!p1Turned) {
            p1.stopTurning();
        }
        if (!p2Turned) {
            p2.stopTurning();
        }
        if (event.getActionMasked() == MotionEvent.ACTION_UP){
            p1.stopTurning();
            p2.stopTurning();
        }
        return notUp;
    } 

当出现故障时,它始终是ACTION_POINTER_UP,并且通过调试我发现问题发生时event.getActionIndex()始终为0,但是当i = 1且event.getX(event.getPointerId(i))被调用时,它会抛出{{ 1}}并且第二次跳过循环。发生这种情况时,活动指针的数量始终为2,因此for块中的代码不会被调用。

对此情况的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

没关系,event.getX()接受索引,而不是ID。有关详细信息,请参阅此处:Android/Processing MotionEvent getX() raises exception