2010-11-21 6 views
1

J'ai un onKeyDown et onMotionEvent surchargé dans mon application. Les deux fonctionnent, mais le onKeyDown a un comportement étrange. Je peux toujours interagir avec l'écran de l'appareil, mais après avoir interagi avec l'écran, les boutons ne fonctionnent pas. Pour les faire fonctionner à nouveau, je dois appuyer sur d'autres boutons (ceux que je n'utilise pas) pour qu'ils puissent fonctionner à nouveau. Et si j'interagis de nouveau avec l'écran, les boutons ne fonctionneront plus.Android: Interagir avec l'écran verrouille les boutons

L'application que j'écris est un jeu, donc les appels de bouton sont faits à la surface et ensuite passés au fil de la partie. Je débogue sur un HTC Aria, mais le problème persiste également dans mes émulateurs.

EDIT

Le code de base que j'ai est la même que celle here détaillée.

Le code pour les boutons sont les suivants:

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent msg) { 
    return thread.doKeyDown(keyCode, msg); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
    return thread.doTouchEvent(event); 
    } 


    public boolean doKeyDown(int keyCode, KeyEvent msg) { 
    synchronized (mSurfaceHolder) { 
     if (keyCode == KeyEvent.KEYCODE_MENU) { 
     showDialog(DIALOG_PAUSED_ID); 
          return true; 
     } 
     return false; 
    } 
    } 

    public boolean doTouchEvent(MotionEvent event) { 
    synchronized (mSurfaceHolder) { 
     if (mState == STATE_PLAYING) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE){ 
       if (event.getX() > 2 * (mWallX/3)) { 

       //shoot arrow 
       shoot(event.getX(), event.getY()); 

       //turn player 
       mPlayer.rotate(event.getX(), event.getY()); 

      return true; 
     } else if (event.getAction() != MotionEvent.ACTION_MOVE && event.getX() < 2 * (mWallX/3)) { 
     //temp button on left for stress test 
       stressTest = !stressTest; 
       return true; 
     } 
     } 
     } 
    return false; 
    } 
    } 
+0

Qu'est-ce que vous revenez de onKeyDown? –

+1

Est-ce que vous bloquez le thread de l'interface utilisateur? C'est à dire. passer le contrôle du gestionnaire d'événement au code du jeu. Pouvez-vous publier le code incriminé? –

+0

code postal ... vous bloquez probablement le fil de l'interface utilisateur qui décrirait le comportement clé que vous voyez/ressentez –

Répondre

1

Allez dans Logcat et regarder les messages qui apparaissent lorsque vous recréez votre problème.

Si vous voyez quelque chose comme «timeout timeout» alors les boutons fonctionnent, votre code est simplement occupé, bloquant toute nouvelle entrée d'être reçu.

+0

Si mon code est occupé, comment pourrais-je faire pour que cela fonctionne? Toute aide serait appréciée, je suis perplexe. –

+0

Je ne peux pas dire à coup sûr sans le code de vos méthodes "shoot" et "rotate", mais il semble que vous exécutez le fil de jeu dans le même fil que le fil de l'interface utilisateur. C'est un non-non. Aller chercher certains des exemples google, tels que LunarLander. – user432209

+0

En fait, j'avais basé mon code sur l'exemple de LunarLander et j'avais exactement le même problème. –

Questions connexes