2010-12-03 2 views
1

Eh bien, j'ai fait une interface utilisateur Android personnalisée, et j'ai besoin de mon affichage de l'interface utilisateur pour gérer ce contrôle.Comment faire la vérification des touches et la maintenance de l'action de l'interface utilisateur?

a) Pendant que mon bouton de la souris enfoncé (onDown/Touche pressée), la vue devrait continuer à faire une chose (par exemple: la clé est vers le bas)

b) Dès que je libère ma clé de la souris , la vue devrait dire (exemple: la clé est en hausse).

Le flux d'échantillon devrait être quelque chose comme lorsque j'appuie sur la vue.

Sortie: (j'appuie sur le bouton de la souris sur la vue et maintenez-)

Key est en baisse

clé est vers le bas

Key est en baisse

Key est bas

La clé est en panne

Key est en baisse

(je libère maintenant le bouton de la souris)

Key est en place.

Pour plus d'expliquer mon problème. Je posterai un extrait de code où la logique devrait aller

@Override 

public boolean onTouchEvent(MotionEvent event) { 
    Log.d(TAG, event.getAction()); 
} 

Lorsque j'appuie sur mon bouton de la souris, il affiche « 0 » (souris signifiant est vers le bas), alors que si je le laisse, il imprime sur le journal " 1 ", ce qui signifie que la souris est en hausse. Cela devrait aider avec la logique.

Merci de votre aide.


Eh bien, je l'ai essayé quelque chose comme

private static int checkValue = 0; 

@Override 

public boolean onTouchEvent(MotionEvent event) { 

    checkValue = event.getAction(); 

    while (checkValue == 0){ 

    Log.d(TAG, "Pressed"); 
    checkValue = checkMethod(event.getAction); 


} 

    private int checkMethod(int test){ 

    if (checkValue == 0){ 

     checkValue = 0; 
     } 

    else checkValue = 1; 
} 
+0

Qu'avez-vous essayé? Qu'est-ce qui ne fonctionne pas? En outre, vous n'avez pas de souris sur Android. Si vous parlez de l'émulateur, c'est une touche. – Falmarri

+0

yah je parle du contact. :) –

+0

J'ai ajouté comment j'ai essayé de résoudre, mais je connais sa logique buggy. –

Répondre

1

définir Juste une OnTouchEventListener ...

private OnTouchListener onTouchListener = new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (v.getId() == R.id.button) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       //start loop or background task 
      } else if (event.getAction() == MotionEvent.ACTION_UP) { 
       //do something different 
      } 
     } 
     return true; 
    } 
} 

... et l'affecter à votre bouton.

button.setOnTouchListener(onTouchListener); 

Lorsque l'utilisateur touche le bouton de l'événement ACTION_DOWN est tiré. Lorsque l'utilisateur relâche le bouton, l'événement ACTION_UP est déclenché. Si vous voulez vous pouvez démarrer une boucle dans un thread qui peut vérifier par rapport à une variable booléenne. Je n'ai pas vérifié si elle est correcte, mais il devrait ressembler à ceci:

private OnTouchListener onTouchListener = new OnTouchListener() { 

     private boolean flag = false; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (v.getId() == R.id.button) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        flag = true; 
        Thread thread = new Thread(new Runnable() { 

         @Override 
         public void run() { 
          while(flag) { 
           //do something 
          } 
         } 
        }); 
        thread.start(); 
       } else if (event.getAction() == MotionEvent.ACTION_UP) { 
        flag = false; 
       } 
      } 
      return true; 
     } 
    } 
+0

Eh bien l'extrait de code que vous avez posté fonctionne :), mais encore quand je relâche mon bouton (Action_up), il faut quelques secondes de plus pour arrêter ... Je me demandais si le le code pourrait être amélioré pour réagir plus vite? :) btw merci pour aider ... –

1

Peut-être que vous pouvez créer et lancer un fil lorsque le contact se produit qui a un champ volatile boolean stop = false et qui vérifie cette valeur dans chaque boucle après avoir dormi pendant une tandis que. Lorsque le toucher se termine, vous pouvez définir la variable booléenne sur false.

Edit: a ajouté un exemple

private MyHandler h; 

public void handleDown() { 
    System.out.println("touch began"); 
    h = new MyHandler(); 
    h.start(); 
} 

public void handleUp() { 
    h.pleaseStop = true; 
    System.out.println("touch ended"); 
} 

class MyHandler extends Thread { 
    volatile boolean pleaseStop = false; 

    public void run() { 
    while (!pleaseStop) { 
     System.out.println("touch is active..."); 
     Thread.sleep(500); 
    } 
    } 
} 
+0

Pouvez-vous s'il vous plaît poster un extrait de code brut pour me faire partir. Merci ... Et oui je dois arrêter immédiatement quand la clé est relâchée. –

+0

@Shahab: a ajouté un exemple – thejh

+0

Merci pour aider :) –

1
checkValue = event.getAction(); 
while (checkValue == 0){ 

Vous devez jamais utiliser des entiers magiques. Utilisez les constantes telles que définies par l'API:

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_DOWN

En fait, votre code n'est pas même pour la comptabilité événements de déplacement; il semble supposer que si ce n'est pas un événement vers le bas c'est un up ... ce qui est complètement faux.

Regardez la documentation pour voir quelles mesures les valeurs que vous pouvez attendre et faire la bonne chose pour les actions spécifiques qui vous intéressent par exemple jusqu'à:.

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_UP

+0

Merci pour le bon conseil: D –

0

Créer un fil qui est initié par le toucher et avoir un drapeau booléen pour le garder en vie. Lorsque la touche est relâchée, définissez l'indicateur sur false pour que le thread se connecte (se termine). Comme le thread est indépendant de la logique principale, le processus est plus rapide.

Questions connexes