2010-06-06 3 views
3

BogueLa gestion des événements de mouvement d'android est-elle précise?

J'ai un bogue bizarre dans mon application de piano. Parfois les clés (et donc les notes) pendent. Je l'ai fait beaucoup de débogage et rétréci vers le bas ce qui ressemble à l'inexactitude de la gestion des événements de mouvement androïdes:

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 

De toute évidence, on peut voir ici que de nulle part je tout à coup un ACTION_UP pour une autre note. Ne devrais-je pas obtenir un ACTION_MOVE en premier?

Comme le montre la fin du journal, ce n'est certainement pas une erreur dans la détection de région, puisque l'événement ACTION_UP est clairement dans la région B4.

Logging détails de mise en œuvre

Chaque onTouchEvent() appel est connecté, de sorte que le journal est exacte.

Le pseudo-code correspondant pour l'enregistrement de ACTION_MOVE est:

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

Question

Est-ce normal pour Android (le saut en coordonnées)?

Un ACTION_UP peut-il apparaître sans aucun ACTION_MOVE précédent vers ses coordonnées?

+0

Sur quel périphérique est-ce que vous effectuez le suivi de plusieurs doigts? Quelle est la répartition de ces sorties de journal? EventX est 292 dans ces deux lignes, si je lis correctement cela ne devrait pas mettre à la fois les notes "Hanging Note" et "KeyUp Note" dans la gamme B4? – adamp

+0

Je n'ai pas le moindre, mais aussi curieux. Fonctionne-t-il correctement dans l'émulateur et/ou d'autres périphériques? – Gerard

+0

@adamp. En regardant en arrière après un moment, en effet la sortie du journal semble un peu suspecte, car elle montre les mêmes coordonnées et une note différente. Cependant, je suis passé à l'enregistrement des touches pressées actuelles avec des identifiants de pointeur et libérant le bon quand un pointeur est levé. – Peterdk

Répondre

0

J'ai eu un problème similaire lorsque j'essayais de développer un jeu de tir simple sur Android. L'astuce que j'ai utilisée pour résoudre ce problème peut ne pas fonctionner si le problème est causé par le matériel, mais cela vaut la peine d'essayer de toute façon.

L'idée générale est d'avoir un tableau de "TouchEvents" et d'itérer à travers ce tableau dans le temps dans une boucle. De cette façon, lorsque l'appareil enregistre des envois tactiles multiples et/ou simultanés, ils sont stockés linéairement dans un tableau, mais ne sont pas traités sur place. vous vous assurez de les gérer les uns après les autres, en supprimant tout événement non synchronisé.

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) ...  

Où: "game.getInput() getTouchEvents()" se réfère simplement à un objet TouchEvent et ses méthodes telles que getTouchEvent

qui a fait l'affaire pour moi, j'espère que cela aide en quelque sorte, bon la chance!