3

漏洞

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

 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坐标的情况下发生吗?

4

1 回答 1

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

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

于 2012-06-15T16:19:43.097 回答