Comment puis-je détecter un clic dans une onTouch auditeur?
J'ai un ViewPager
à l'intérieur d'un ScrollView
. J'ai besoin d'être en mesure de faire défiler horizontalement ainsi que verticalement. Afin d'atteindre cet dû désactiver le défilement vertical chaque fois que mon ViewPager
est touché (v.getParent().requestDisallowInterceptTouchEvent(true);
), de sorte que vous pouvez faire défiler horizontalement.
Mais en même temps j'ai besoin d'être en mesure de cliquer sur le viewPager pour l'ouvrir en mode plein écran.
Le problème est que onTouch est appelée avant onClick et mon OnClick n'est jamais appelée.
Comment puis-je mettre en œuvre à la fois sur appuyez sur un onClick?
viewPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
System.out.println("TOUCHED ");
if(event.getAction() == MotionEvent.???){
//open fullscreen activity
}
v.getParent().requestDisallowInterceptTouchEvent(true); //This cannot be removed
return false;
}
});
viewPager.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("CLICKED ");
Intent fullPhotoIntent = new Intent(context, FullPhotoActivity.class);
fullPhotoIntent.putStringArrayListExtra("imageUrls", imageUrls);
startActivity(fullPhotoIntent);
}
});
- Avez-vous essayé de retourner true de onTouch?
Vous devez vous connecter pour publier un commentaire.
Masoud Dadashi réponse m'a aidé à le comprendre.
voici à quoi il ressemble en fin de compte.
ViewConfiguration.get(context).getScaledTouchSlop()
au lieu de la valeur codée en dur de 200.J'ai fait quelque chose de vraiment simple, en enregistrant à la fois que l'utilisateur touche l'écran.
Également intéressant de noter que GestureDetector a construit dans cette. Regardez onSingleTapUp
Le développement est une mauvaise idée. lorsque l'utilisateur peut faire des choses différentes en touchant l'écran à la compréhension de l'utilisateur de but est un peu astucieux et vous avez besoin de développer un morceau de code pour cela.
Deux solutions:
1- (le meilleur idée) dans votre onTouch événement vérifier si il y a un mouvement. Vous pouvez le faire en vérifiant si il n'y a aucun mouvement à l'aide de:
de faire comme ceci
vous pouvez même vérifier la distance du mouvement de l'utilisateur doigt sur l'écran pour vous assurer un mouvement qui s'est passé, plutôt que d'une altération de se déplacer tout en cliquant. de faire comme ceci:
considère que c'est un clic si aucun des ci-dessus qui s'est passé et de faire ce que vous voulez avec le clic.
2) si les rimes avec votre INTERFACE utilisateur, créer un bouton ou un bouton image ou quoi que ce soit pour plein de dépistage et de définir un onClick pour elle.
Bonne chance
!isDown && !isUp
dire que c'est un clic? pourquoi est-ce?. Je viens d'essayer et ça et ça n'a pas fonctionné quand j'ai cliqué.Vous pourriez avoir besoin de différencier entre l'utilisateur en cliquant sur et en un clic long. Sinon, vous allez détecter à la fois comme la même chose. Je l'ai fait pour rendre cela possible:
Les réponses ci-dessus pour la plupart mémoriser le temps. Cependant,
MotionEvent
déjà vous a couvert. Voici une solution avec moins de frais généraux. C'est écrit danskotlin
mais il devrait encore être compréhensible:Cette solution est assez bon pour la plupart des applications, mais n'est pas si bon à faire la distinction entre un clic et d'un rapide geste de la main.
Donc, en combinant ceci avec les réponses ci-dessus qui prennent également la position en compte, c'est probablement le meilleur.
Je pense que la solution combinée de l'heure/de position devrait être mieux:
Je crois que vous êtes la prévention de votre point de vue de la réception de l'événement de touche de cette façon parce que vos TouchListener l'intercepte.
Vous pouvez soit
v.onTouchEvent(event)
ViewPager.onTouchEvent(MotionEvent)
de ne pas intercepter l'événementAussi, de retour
true
signifie que vous n'avez pas de consommer de l'événement, et que vous n'êtes pas intéressé (e) dans les événements suivants, et vous n'aurez donc pas de recevoir des événements suivants jusqu'à ce que le geste complète (qui est, le doigt est encore).vous pouvez utiliser OnTouchClickListener
https://github.com/hoffergg/BaseLibrary/blob/master/src/main/java/com/dailycation/base/view/listener/OnTouchClickListener.java
utilisation:
HTML:
Je pense que votre problème vient de la ligne:
Prendre un coup d'oeil à la la documentation.
Avez-vous essayé de supprimer la ligne? Qu'est-ce que le requeriment pour ne pas supprimer cette ligne?
Prendre en compte, selon la la documentation, que si vous retournez vrai à partir de votre onTouchListener, l'événement est consommé, et si vous retourne la valeur false est propagée, de sorte que vous pouvez l'utiliser pour propager l'événement.
Aussi, vous devez modifier votre code à partir de:
à:
Pour obtenir de bons résultats dans le logcat.