android的动作事件处理是否准确?

时间:2010-06-06 14:57:13

标签: android touch motion-detection

错误

我的钢琴应用程序中有一个奇怪的错误。有时键(以及音符)会挂起。我做了很多调试,并将其缩小到看起来像运动事件处理的机器人不准确的地方:

 DEBUG/(2091): ACTION_DOWN A4
 DEBUG/(2091): KeyDown: A4
 DEBUG/(2091): ACTION_MOVE A4 => A4
 DEBUG/(2091): ACTION_MOVE ignoring
 DEBUG/(2091): ACTION_MOVE A4 => A4
 DEBUG/(2091): ACTION_MOVE ignoring
 DEBUG/(2091): ACTION_MOVE A4 => A4
 DEBUG/(2091): ACTION_MOVE ignoring
 DEBUG/(2091): ACTION_UP B4 //HOW CAN THIS BE????
 DEBUG/(2091): KeyUp: B4
 DEBUG/(2091): Stream is null, can't stop
 DEBUG/(2091): Hanging Note: A4 X=240-287 EventX=292 Y=117-200 EventY=164
 DEBUG/(2091): KeyUp Note:   B4 X=288-335 EventX=292 Y=117-200 EventY=164

显然,在这里我可以看到突然间我突然有ACTION_UP的另一个音符。我不应该首先得到ACTION_MOVE吗?

如日志末尾所示,区域检测中肯定不是错误,因为ACTION_UP事件明显位于B4区域。

记录实施细节

记录每次onTouchEvent()次呼叫,因此日志准确无误。

ACTION_MOVE记录的相关伪代码是:

 Key oldKey = Key.get(event.getHistoricalX(), event.getHistoricalY());
 Key newKey = Key.get(event.getX(), event.getY());

问题

这是Android的正常行为(跳跃坐标)吗?

ACTION_UP可以在没有任何先前的ACTION_MOVE朝向它的坐标的情况下发生吗?

1 个答案:

答案 0 :(得分:0)

当我尝试在Android上开发简单的射击游戏时,我遇到了类似的问题。如果问题是由硬件引起的,我用来解决这个问题的技巧可能不起作用,但无论如何都值得一试。

一般的想法是拥有一个“TouchEvents”数组,并在循环中随时间迭代遍历此数组。这样,当设备注册多个和/或同时触摸事件时,它们在阵列中线性存储,但不在现场处理。你确保一个接一个地处理它们,删除任何不同步的事件。

List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
    int len = touchEvents.size();
    for(int i = 0; i < len; i++) {
        TouchEvent event = touchEvents.get(i);

        if(event.type == TouchEvent.TOUCH_DRAGGED || event.type == TouchEvent.TOUCH_DOWN) ...    

其中:“game.getInput()。getTouchEvents()”只是指一个TouchEvent对象及其方法,如getTouchEvent

这对我有用,我希望这会有所帮助,祝你好运!