多点触控在 Android 上的实际效果如何?

How does multi-touch really work on Android?

在我的用例中有 2 个图标(在 GL 场景中),我想并行且独立地处理它们的按下、保持和释放状态(用 2 个手指)。

为此,我尝试了许多代码变体。目前这是性能最好但仍然很糟糕的代码:

@Override
public boolean onTouch(View v, MotionEvent e) {
    if (v != this) return false;
    boolean down = false;
    switch (e.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_POINTER_DOWN:
            down = true;
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_OUTSIDE:
        case MotionEvent.ACTION_CANCEL:
            down = false;
            break;
    }

    boolean handled = e.getPointerCount() > 0;
    for(int i = 0; i < e.getPointerCount(); i++) {
        e.getPointerCoords(i, coords);
        int pointer = e.getPointerId(i);
        if (down) {
            scene.sizes.pixelToCm(vec, coords.x, coords.y);
            touchMap.set(pointer, vec.getX(), vec.getY());
        } else {
            touchMap.clear(pointer);
        }
    }
    return true;
}

在这种情况下,当我按住图标A时,就可以了。比起我仍然按住图标 A 并按下图标 B,也可以,两个图标都被按下了。但是当我释放图标 B 时,图标 A 也会暂时释放。

我猜 onTouch() 事件处理程序得到一个 UP 事件,但它的指针列表(e.getPointerCount(),e.getPointerCoords())还包括 DOWN 指针。

谁能帮我解决这个问题?

这段代码似乎符合我的预期:

@Override
public boolean onTouch(View v, MotionEvent e) {
    if (v != this) return false;
    for(int i = 0; i < 8; i++)
        touchMap.clear(i);
    if (e.getActionMasked() ==  MotionEvent.ACTION_UP) {
        return true;
    }
    for(int i = 0; i < e.getPointerCount(); i++) {
        e.getPointerCoords(i, coords);
        int pointer = e.getPointerId(i);
        scene.sizes.pixelToCm(vec, coords.x, coords.y);
        touchMap.set(pointer, vec.getX(), vec.getY());

    }
    return true;
}