11
votes

Swipe horizontale non détectée dans le parent de ScrollView

Duplicaté possible: strong>

Détection de gestuelle et problème de ScrollView P>

EDIT: B> Question avec le code complet a demandé à ici . P>


J'ai une disposition avec un enfant. J'ai défini un auditeur de geste pour détecter le balayage horizontal sur la mise en page. Lorsque la mise en page est une linearlayout, le balayage est correctement détecté, mais quand c'est une vision de défilement, ce n'est pas le cas. Je suppose que le geste est toujours détecté par la ScrollView et n'est pas propagé à ses ascendants, mais je ne sais pas comment résoudre le problème. P>

Voici ma mise en page: P>

class ProductGestureListener extends SimpleOnGestureListener {

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        final int SWIPE_MIN_DISTANCE = 120;
        final int SWIPE_MAX_OFF_PATH = 250;
        final int SWIPE_THRESHOLD_VELOCITY = 200;            

        try {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return false;
            if(e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {                   
                // show previous item
            }  else if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
               // show next item
            }
        } catch (Exception e) {
        }           
        return false;
    }
}


6 commentaires

Cette question devrait fournir la réponse Stackoverflow.com/ Questions / 2646028 / ...


Je l'ai essayé mais le balayage sur la mise en page n'est toujours pas détecté.


J'ai utilisé la réponse de ce lien il y a quelques jours et cela a fonctionné pour moi, pouvez-vous publier votre fichier de mise en page et votre code pertinent?


J'ai ajouté le code de l'auditeur de geste dans ma mise en page.


Je ne voulais pas joindre le détecteur de geste à la mise en page, le fichier XML de la mise en page IMANT POST, mais je pense que je vois le problème, je posterai dans une réponse


Ma mise en page est très simple, je l'ai ajoutée à ma question.


3 Réponses :


18
votes

Si vous voulez l'ensemble de l'activité pour être glissage horizontalement, vous pouvez utiliser ce qui suit en tant que super catégorie pour votre activité : xxx

Tout ce que vous avez à faire est d'implémenter le suivant () et précédent () méthodes après l'étendue swipeactivité .


0 commentaires

1
votes

La séquence des événements pour Android est ce

L'utilisateur effectue une action -> L'action est transmise au parent -> Si le parent gère l'action, l'action est consommée -> sinon l'action est transmise à un enfant -> Si l'enfant gère l'action, l'action est consommée -> sinon l'action est transmise sur

Ce processus continue jusqu'à ce que l'action soit consommée ou que tous les enfants ont reçu l'action et aucun d'entre eux ne le gère.

Pour détecter un balayage horizontal dans une vue de défilement et transmettez-le à un enfant au lieu de la vue de défilement consommant, l'événement doit être intercepté.

IE L'utilisateur effectue une action -> L'action est transmise au parent -> Si le balayage horizontal passe à l'enfant -> sinon ont la vue de la vue de défilement l'action

Pour ce faire (comme aligné dans la bonne réponse ici: horizontalscrollview in ScrollView Touch Manipulation ) Un détecteur de gestes est utilisé dans la vue de défilement dans le seul but de détecter si le geste est horizontal ou vertical.

Si le geste est horizontal, nous voulons intercepter l'événement et le transmettre à l'enfant.

Vous devez créer une vision de Scroll personnalisée, puis implémenter un détecteur de geste et l'appeler à partir de OnterceptTouch (). En revenant vrai ou faux ici, nous pouvons dire s'il faut ou non consommer de l'événement ici, tout ce dont vous avez besoin est dans ce lien ci-dessus.


3 commentaires

Si je remplace la vision de ScrollView par un linearlayout, cela fonctionne, mais avec un ScrollView, l'auditeur de geste sur le parent n'est jamais déclenché ...


Où mettez-vous exactement votre détecteur de gestes?


J'ai posé une nouvelle question avec tout mon code: Stackoverflow.com / Questions / 8330187 / ...



10
votes

Je devais ajouter

@Override
public boolean dispatchTouchEvent(MotionEvent ev){
    super.dispatchTouchEvent(ev);    
    return productGestureDetector.onTouchEvent(ev); 
}


0 commentaires