J'ai une classe CustomCanvasView
qui étend View
, et j'ai mis en place en cliquant, en faisant glisser et zoom-pincement pour la classe. Maintenant, je veux implémenter de longs clics.Comment puis-je implémenter des clics longs sur une vue lorsque des coordonnées de clic exactes sont nécessaires?
D'après ce que j'ai lu dans divers postes, tout le monde a une façon different de le faire, mais le consensus général semble être que je devrais utiliser soit un OnLongClickListener
ou GestureDetector
. Cependant, j'ai besoin des coordonnées exacte du clic long, et je suis inquiet que ces approches ne puissent pas bien jouer avec ce que j'ai travaillé dans ma méthode onTouch()
.
Alors, quelle approche est vraiment la meilleure pour ces besoins spécifiques?
MISE À JOUR
Alors, j'ai décidé de mesurer le temps manuellement en définissant startTime = System.nanoTime();
dans le ACTION_DOWN
cas de mon événement onTouch(...)
, dans le ACTION_UP
cas puis trouver
estimatedTime = System.nanoTime() - startTime;
seconds = (double) estimatedTime/1000000000.0;
et d'essais pour voir si cette valeur dépasse 1. Cela a fonctionné, et donc je voulais ajouter des commentaires haptiques. Puisque tout cela est géré à l'intérieur d'une classe (pas une activité), j'ai décidé de passer les informations sur le clic à l'activité associée, et de faire vibrer l'appareil en utilisant un Vibrator
dans le cas d'un clic long. Cela fonctionne également, mais, puisque les informations ne sont pas transmises avant la fin du long clic, c'est-à-dire lorsque la vibration se produit.
Dans les applications que j'ai utilisé la rétroaction haptique se produit bien que votre doigt est baissé de sorte que vous pouvez dire que vous avez dépassé le seuil de temps pour un clic long avant vous soulevez votre doigt. Y a-t-il un moyen de le faire sans refaire toute la logique de mon application? Est-ce que je peux vibrer le téléphone d'une classe interne?
MISE À JOUR
Je compris comment faire le retour haptique fonctionne mieux que c'était. Ce n'est toujours pas parfait, mais voici comment je l'ai fait.
Plutôt que de vérifier la valeur de estimatedTime
dans le ACTION_UP
cas de onTouch(...)
, je mis un booléen timerStarted
égal à true
dans le ACTION_DOWN
cas, puis au début de onTouch(...)
il suffit de vérifier si la minuterie a été lancé, et si oui inspecter la valeur de . Si elle dépasse ma valeur de seuil, je dis à l'activité associée de fournir une rétroaction haptique. J'ai également mis mode = LONG_CLICK
donc j'ai cette information dans le cas ACTION_UP
. Vous devez juste vous assurer de régler timerStarted = false
dans tous les bons endroits (c'est-à-dire si vous déterminez que l'événement est un événement de zoom, un événement de déplacement ou un événement de clic) et vous devriez être bon.
Merci!
réponse parfaite. –