Точно ли обрабатывается событие движения Android? - PullRequest
3 голосов
/ 06 июня 2010

ошибка

У меня странная ошибка в моем приложении для фортепиано. Иногда ключи (и, следовательно, заметки) зависают. Я сделал много отладок и сузил их до того, что похоже на неточность андроида обработки событий движения:

 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 голосов
/ 15 июня 2012

У меня была похожая проблема, когда я пытался разработать простую шутер на 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

Это помогло мне, надеюсь, это поможет, удачи!

...