我开发了一个在视图中处理多点触控的 Android 应用程序。我基本上跟踪可能发生的几个 MotionEvent,例如 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 事件...是吗?