Je m'amuse actuellement à programmer Android, mais j'ai un petit problème pour détecter différents événements tactiles, à savoir une pression normale (appuyer sur l'écran et relâcher immédiatement), une pression longue (toucher l'écran et maintenir le doigt dessus) et un mouvement (glisser sur l'écran).
Ce que je voulais faire, c'est avoir une image (d'un cercle) sur mon écran que je peux déplacer. Ensuite, lorsque j'appuie une fois dessus (appui court/normal), un Toast s'affiche avec quelques informations de base sur l'image. Lorsque j'appuie longuement sur l'image, une fenêtre d'alerte s'affiche avec une liste permettant de sélectionner une autre image (cercle, rectangle ou triangle).
J'ai créé une vue personnalisée avec mon propre OnTouchListener pour détecter les événements et dessiner l'image dans onDraw. Le OnTouchListener.onTouch ressemble à ceci :
// has a touch press started?
private boolean touchStarted = false;
// co-ordinates of image
private int x, y;
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
touchStarted = true;
}
else if (action == MotionEvent.ACTION_MOVE) {
// movement: cancel the touch press
touchStarted = false;
x = event.getX();
y = event.getY();
invalidate(); // request draw
}
else if (action == MotionEvent.ACTION_UP) {
if (touchStarted) {
// touch press complete, show toast
Toast.makeText(v.getContext(), "Coords: " + x + ", " + y, 1000).show();
}
}
return true;
}
Le problème, c'est que la pression ne fonctionne pas comme prévu, car lorsque je touche l'écran avec désinvolture, il détecte également un petit mouvement et annule la pression tactile pour déplacer l'image à la place.
J'ai "bidouillé" un peu en introduisant une nouvelle variable "mTouchDelay" que je fixe à 0 sur ACTION_DOWN, que j'augmente dans MOVE et si elle est >= 3 dans MOVE, j'exécute mon code de "déplacement". Mais j'ai l'impression que ce n'est pas vraiment la bonne méthode.
Je n'ai pas non plus trouvé comment détecter un appui long. Le coupable est vraiment le MOVE qui semble toujours se déclencher.
Pour un exemple de ce que je veux en gros, voyez l'application Android "DailyStrip" : elle montre l'image d'une bande dessinée. Vous pouvez la faire glisser si elle est trop grande pour l'écran. Vous pouvez l'effleurer une fois pour faire apparaître certaines commandes et l'appuyer longuement pour afficher un menu d'options.
PS. J'essaie de le faire fonctionner sur Android 1.5, puisque mon téléphone ne fonctionne que sur 1.5.
0 votes
Cela nécessite une balise Java. Cependant, si vous parvenez un jour à mettre en place cette fonctionnalité dans une application Web, accessible via jQuery, j'essaie de trouver comment intercepter également le tapotement long (tapotement maintenu, pression longue).