Comment combiner OnClickListener et OnTouchListener pour un ImageButton
J'ai besoin de faire quelque chose lorsque l'utilisateur clique sur le ImageButton
j'ai essayé de créer une classe statique qui implémente les deux OnClickListener
et OnTouchListener
static class ClickListenerForScrolling implements OnClickListener, OnTouchListener
qui possède les méthodes suivantes:
@Override
public void onClick(View v)
et
@Override
public boolean onTouch(View arg0, MotionEvent arg1)
L'idée derrière cela est de changer la source de l'image de la ImageButton
lorsque l'utilisateur touche, et d'exécuter une tâche lorsque l'utilisateur clique sur ce bouton. Quelqu'un peut-il me donner un indice sur la façon de faire cela?
- Comment vous êtes thiking différence entre onTouch et de l'action onClick sur l'écran tactile . Je ne pense pas que les deux fonctions peuvent être obtenus sur l'élément. Aimerai savoir tous les succès que si vous avez atteint.
- si vous le voulez vraiment, vous pouvez aussi le faire sur ACTION_UP exécuter une vue.performClick()
- juste retour de false comme l'a expliqué Sven ci-dessous.
Vous devez vous connecter pour publier un commentaire.
Depuis deux actions consistent en des gestes "mettre le doigt sur l'écran - lever le doigt de l'écran" vous ne pouvez pas déterminer si il touche d'action ou cliquez sur l'action. Donc, si vous implémentez des auditeurs sur ce bouton image, un touch/cliquez sur va changer l'image ET appuyez sur le bouton. Vous ne savez pas si il y a un ordre déterminé de ces événements...
Cependant, si vous souhaitez séparer de ces événements, vous aurez besoin de définir dans un geste d'une des actions (comme d'essuyage à changer l'image), ou de créer différents espaces qui gèrent les événements, par exemple, l'image ne convient pas à l'ensemble de bouton et la zone de libre sert de bouton, cliquez sur la zone.
HTH
Mise à jour:
J'ai compris, qu'un
TouchEvent
est plus général qu'unClickEvent
ainsi, il est appelé en premier.Cela renvoie true si l'auditeur a consommé de l'événement, false sinon.
De sorte que vous pouvez décider de la mise en œuvre si l'Événement doit également être pris en charge par OnClickListener, puis il suffit de retourner
false
.false
il fixe. (onClick
ne retourne rien)La
onTouchListener
est capable de gérer à la fois les mouvements.Switch
entreevent.action()
les valeurs pour obtenirMotionEvent
.case MotionEvent.ACTION_DOWN
: est le premier doigt de l'impact.case MotionEvent.ACTION_UP
: quand le doigt s'en va.Vous aurez à définir le point d'impact sur
ACTION_DOWN
.TheImpactPoint=event.getX();
Et ensuite obtenir la distance avec
ACTION_UP
float distance =TheImpactPoint-event.getX();
If distance = 0
il y a ensuite un clic, sinon il serait plus ou moins de zéro selon geste.C'est donc la façon d'utiliser l'événement click, sans réel cliquez sur l'événement et en utilisant seulement les
onTouchListener
.L'espère, sera utile.
Utiliser ce code:
Étendre cette classe et de l'utiliser comme ça...
Utilisation
return false
au lieu dereturn true
Il existe de nombreuses solutions pour ce problème, la meilleure solution pour moi est d'éliminer totalement le setOnClickListener et à l'intérieur de la onTouchListener faire vérifier si l'action est ACTION_UP et puis à l'intérieur de cette case si le dernier avant que c'est ACTION_DOWN:
lastAction est de type int et je le met à jour à la fin de chaque ACTION