Dans ce court chapitre, nous allons améliorer l'expérience utilisateur, c'est-à-dire nous assurer que le joueur soit correctement informé des différents événements, qu'il ne se sente pas perdu et qu'il soit heureux d'utiliser votre application.
Amélioration de l'expérience utilisateur
Avec l'implémentation que nous venons de mettre en place, vous devez constater la chose suivante : dès que le joueur sélectionne une réponse, la question suivante se met systématiquement à jour alors que le message Toast n'a même pas eu le temps de disparaître.
Dans l'idéal, il faudrait attendre que le message Toast disparaisse pour ensuite afficher la question suivante. Et entretemps, ce serait encore mieux d'empêcher l'utilisateur d'appuyer sur un autre bouton.
Temporisation
Nous allons utiliser ici une méthode d'attente très simple : nous allons demander au système de patienter deux secondes avant d'exécuter notre bout de code. Cela permettra d'attendre la fin de l'affichage du message Toast. Voici le code :
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// If this is the last question, ends the game.
// Else, display the next question.
}
}, 2_000); // LENGTH_SHORT is usually 2 second long
La classe Handler permet de communiquer avec le système pour lui demander d'exécuter une action. La méthode associée est postDelayed(). Le premier paramètre est un objet de type Runnable, c'est-à-dire l'action que vous souhaitez accomplir. L'action est déterminée dans la méthode run().
Le second paramètre est la durée d'attente, en millisecondes. Vous pouvez adapter la durée d'attente suivant la durée d'affichage du Toast que vous avez choisie (LENGTH_SHORT = 2 s et LENGTH_LONG = 3,5 s).
De la même manière, je vous laisse réfléchir un peu et développer vous-même ce que vous allez mettre dans cette méthode run().
Désactivation des clics
Dès que l'utilisateur a sélectionné une réponse et que le message Toast s'affiche, il faut l'empêcher de cliquer de nouveau sur une autre réponse, le temps d'afficher la question suivante.
Pour ce faire, nous allons utiliser la méthode dispatchTouchEvent(). C'est une méthode de la classe Activity, qui est appelée à chaque fois qu'un utilisateur touche l'écran. Elle est un endroit idéal pour ignorer temporairement les clics de l'utilisateur. Je vous invite à surcharger cette méthode, en utilisant le raccourci CTRL + O
(O pour Override), en tapant les premières lettres pour trouver la méthode, puis en appuyant sur la touche Entrée
. La signature de la méthode est la suivante :
public boolean dispatchTouchEvent(MotionEvent ev);
Le booléen renvoyé permet de dire au système si l'action de l'utilisateur doit être prise en compte ou non. Si l'action doit être ignorée, renvoyez false. Sinon, appelez la méthode de la classe mère. Par exemple, l'implémentation pourrait être :
return mEnableTouchEvents && super.dispatchTouchEvent(ev);
Il vous suffit simplement de gérer un attribut de classe (nommé mEnableTouchEvents), et de le valoriser à true lorsque les actions doivent être prises en compte, ou à false si elles doivent être ignorées.
En résumé
La classe Handler permet de communiquer avec le système pour lui demander d'exécuter une action.
Pour désactiver les clics, utilisez la méthode dispatchTouchEvent().
Notre application est maintenant plus efficace : le joueur comprendra mieux le déroulé du jeu, et ne sera pas surpris entre deux questions. Nous sommes proches du but ! 😃 Dans le prochain chapitre, nous nous pencherons sur le cycle de vie d'une activité !