ple:Android多点触控“指针指数超出范围” - 为什么?

时间:2015-08-20 14:37:54

标签: android touch

我知道该主题还有一些其他主题,但毫无疑问可以将问题简化为几行代码:

@Override
public boolean onTouchEvent(MotionEvent event) {

    int count = event.getPointerCount();
    for (int i = 0; i < count; ++i) {
        int id = event.getPointerId(i);
        event.getX(id); // Exception here
    }

}

代码只获取指针数,询问指针id并使用它来读取指针的x值。

当我使用多个手指时,代码抛出“IllegalArgumentException:pointerIndex超出范围”。

抛出异常并执行所有可能的操作(“ACTION_DOWN”,“ACTION_POINTER_DOWN”,“ACTION_UP”,“ACTION_POINTER_UP”和“ACTION_MOVE”)

示例:

我放下手指一,然后放下手指两个,然后放上手指一个=&gt;手指的每一个动作现在都失败了。

完成onTouchEvent测试:

@Override
public boolean onTouchEvent(MotionEvent event) {

    int action = (event.getActionMasked() & MotionEvent.ACTION_MASK);
    int count = event.getPointerCount();

    String actionStr = null;

    switch (action) {
        case MotionEvent.ACTION_DOWN:
            actionStr = "down";
            break;
        case MotionEvent.ACTION_UP:
            actionStr = "up";
            break;
        case MotionEvent.ACTION_MOVE:
            actionStr = "move";
            break;
        case MotionEvent.ACTION_POINTER_UP:
            actionStr = "pointer up";
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            actionStr = "pointer down";
            break;
    }

    try {

        for (int i = 0; i < count; ++i) {
            int id = event.getPointerId(i);
            event.getX(id);
            //event.getY(id);
        }

    } catch (Exception e) {
        Log.d("_FAIL_", actionStr);
    }

    return true;
}

1 个答案:

答案 0 :(得分:1)

你应该这样做:

event.getX(event.findPointerIndex(id));

修改

来自Android Developer Site

  

未定义单个指针在运动事件中出现的顺序。因此,指针的索引可以从一个事件改变到下一个事件,但只要指针保持活动状态,指针的指针ID就保证保持不变。使用getPointerId()方法获取指针的ID,以跟踪手势中所有后续运动事件的指针。然后,对于连续的运动事件,使用findPointerIndex()方法获取该运动事件中给定指针ID的指针索引。

我希望它有所帮助。