多点触控如何在Android上真正起作用?

时间:2015-11-22 11:23:49

标签: android multi-touch

在我的用例中有2个图标(在GL场景中),我希望平行和独立地处理他们的按下,保持和释放状态(用两根手指)。

为此,我尝试了很多代码变体。目前这是表现最好但仍然不好的代码:

@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指针。

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

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

@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;
}