Question

J'ai une application événement nécessitant un traitement d'une façon inhabituelle.

Pour ma question, permettez-moi d'abord expliquer un cas simple que le système de gestion des événements en cours d'Android ne se adapte pas à moi.

En supposant que j'ai FrameLayout (que je vais appeler ViewSwiper depuis maintenant) que toutes les vues ajoutées dessus sont MATCH_PARENT X MATCH_PARENT (que je vais appeler PageView), il est des événements poignées en traduisant la vue réelle et de le remplacer en fonction sur la direction de déplacement. Ce que je déjà partie ai fait et le travail correctement ( Utilisation de l'animation aux vues swipe ).

Mais le problème est que ajouter PageView I sur le dessus de celui-ci, en cas de ImageViews ce faux retour sur son onTouchEvent, le ViewSwiper va gérer les événements et laisser un autre PageView accéder à l'écran, mais si j'ajoute un ScrollView sur ce , tous les événements seront consommés par le défilement et la ViewSwiper n'aura pas la chance de remplacer le PageView.

Alors je me suis dit que le retour faux onTouchEvent du ScrollView le parent peut prendre les événements de elle, je l'ai écrit cette sous-classe de ScrollView pour le tester:

public class ScrollViewVertical extends ScrollView {
    public ScrollViewVertical(Context context) {
        super(context);
        setOverScrollMode(OVER_SCROLL_ALWAYS);
        setVerticalScrollBarEnabled(false);
    }

    public boolean onTouchEvent(MotionEvent evt) {
        super.onTouchEvent(evt);
        return false;
    }
}

Mais le retour faux faire d'autres événements pour obtenir envoyés aux parents, mais je besoin de ces événements pour le défilement vertical, donc j'ai l'idée de retour faux que si l'utilisateur se déplace HORIZONTAL, c'est ce que mon apparence de code comme:

public class ScrollViewVertical extends ScrollView {
    private MovementTracker moveTracker;
    public ScrollViewVertical(Context context) {
        super(context);
        setOverScrollMode(OVER_SCROLL_ALWAYS);
        setVerticalScrollBarEnabled(false);
        moveTracker = new MovementTracker();
    }
    public boolean onTouchEvent(MotionEvent evt) {
        if (moveTracker.track(evt))
            if (moveTracker.getDirection() == Direction.HORIZONTAL)
                return false;

        return super.onTouchEvent(evt);
    }
}

PS:. MovementTracker sera renvoie true sur la bonne voie () après quelques événements et de dire sur quelle direction l'utilisateur se déplace

Mais dans ce cas, le ScrollView continue à recevoir des événements depuis les retours de ce vrai sur les premiers événements.

Toutes les idées sur comment puis-je gérer les événements sur ViewSwiper quand il est enfant revient faux (même si certains sont retournés trues).

PS. Je ne peux donner plus d'informations à ce sujet si nécessaire, et d'accepter différentes solutions aussi

Sur la base des réponses que j'essayé ce qui suit:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    onTouchEvent(ev);
    return intercept;
}

public boolean onTouchEvent(MotionEvent evt) {
    boolean x = super.onTouchEvent(evt);

    if (moveTracker.track(evt)) {
        intercept = moveTracker.getDirection() != Direction.VERTICAL;
        if (!intercept)
            getParent().requestDisallowInterceptTouchEvent(false);
    }

    return x;
}

Toujours rien.

Était-ce utile?

La solution

essayez ceci dans onTouchEvent() du scrollview

     //if (evt.getAction() == MotionEvent.ACTION_MOVE) {
    if (moveTracker.track(evt)){
       if (moveTracker.getDirection() == Direction.VERTICAL){
          //Or the direction you want the scrollview keep moving
          getParent().requestDisallowInterceptTouchEvent(true);

            }
        } 
 return true;

Mise à jour

S'il vous plaît essayez ce qui suit à la coutume ScrollView

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

Et rien d'autre

De cette façon, je suppose que le MotionEvent effectuera sur les deux points de vue. Et comme ils ne sont pas incompatibles (L'un est vertical l'autre est horizontal) cela pourrait fonctionner

Autres conseils

D'après la réponse de weakwire, je suis venu à la solution suivante:

ViewSwiper

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

Et sur le retour ScrollHorizontal je faux sur dispatchTouchEvent quand je ne ai pas besoin alors plus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top