Android 多点触控:ACTION_UP 不总是被调用?

8

我开发了一个处理视图中多点触控的Android应用程序。我基本上会跟踪可能发生的几个MotionEvents,如ACTION_UP、ACTION_MOVE等。我的View类中重写的onTouch方法如下:

public boolean onTouch(View view, MotionEvent event) 
{
    int action = event.getAction() & MotionEvent.ACTION_MASK;

    if (action == MotionEvent.ACTION_DOWN) {
        float x = event.getX();
        handleTouchStart(view, x);
    } else if (action == MotionEvent.ACTION_UP) {
        float x = event.getX();
        handleTouchEnded(view, x);
    } else if (action == MotionEvent.ACTION_POINTER_DOWN) {
        int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
        float x = event.getX(pointer);
        handleTouchStart(view, x);
    } else if (action == MotionEvent.ACTION_POINTER_UP) {
        int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
        float x = event.getX(pointer);
        handleTouchEnded(view, x);
    } else if (action == MotionEvent.ACTION_MOVE) {
        int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
        float x = event.getX(pointer);
        handleTouchMoved(view, x);
    }

    return true;
}

在我的手机上(三星Galaxy S),这个功能非常完美。每次调用handleTouchStart(),都会调用相应的handleTouchEnded()。这对我的应用程序至关重要。它是一个2D横向卷轴游戏,屏幕左下方有一个方向盘区域。如果由于某种原因,当用户从触摸屏上抬起手指时没有调用handleTouchEnded()方法,则玩家角色将继续奔跑。
我收到了来自其他设备(如HTC Desire)的玩家报告,偶尔即使他们在屏幕上的方向盘区域抬起手指,角色也确实会继续朝一个方向奔跑。我得出结论,只有在没有调用handleTouchEnded()方法的情况下,才会发生这种情况,这反过来意味着不会生成任何ACTION_UP(或ACTION_POINTER_UP)事件。
是否存在特定于设备的多点触摸支持实现?无法保证每个ACTION_DOWN(或ACTION_POINTER_DOWN)MotionEvent都会调用适当的ACTION_UP(或ACTION_POINTER_UP)MotionEvent吗?还是我错过了什么?我的onTouch实现是否正确?
我的更广泛的问题是:是否有更好的方法来处理“动作”游戏的多点触摸屏输入?我基本上在模仿游戏手柄方向十字键的左右控制。我发现Android的UI按钮不提供足够的灵活性,因为它们无法跟踪onPress和onRelease事件...或者它们可以吗?

你知道这种情况偶然发生的频率有多高吗? - David T.
1个回答

17

您漏掉了一些东西。 ;) 还有一种操作类型需要处理:ACTION_CANCELACTION_CANCEL是在手势被某个更高级别的组件拦截并接管了,等等情况下,发送的操作类型信息。


1
非常感谢!我简直不敢相信我自己没看到那个。然而,这些手势在不同的硬件上工作方式似乎有所不同,这很奇怪。 - Maximilian Csuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接