我开发了一个在视图中处理多点触控的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事件......还是它们呢?
答案 0 :(得分:15)
你错过了什么。 ;)您应该处理另外一种操作类型:ACTION_CANCEL
。当正在进行的手势在某个更高级别中止时,会发送ACTION_CANCEL
- 某些更高级别的组件可能截获了该手势并将其取消等等。