Frage

Ich habe eine Anwendung, die auf ungewöhnliche Weise Event -Handling benötigt.

Lassen Sie mich für meine Frage zunächst einen einfachen Fall erklären, dass das aktuelle Ereignishandhabungssystem von Android nicht für mich passt.

Angenommen, ich habe einen Framelayout (den ich seitdem Viewswiper anrufen werde), dass alle darauf hinzugefügten Ansichten match_parent x match_parent sind (die ich Seitenansicht anrufen werde), wird Ereignisse übersetzt, indem sie die tatsächliche Ansicht übersetzen und basierend auf der Richtung ersetzen sich bewegen. Diese Komponente, die ich bereits getan habe und die ich ordnungsgemäß gearbeitet habe ( Verwenden der Animation zum Wischen von Ansichten ).

Das Problem ist jedoch auf dieser Seitenaufnahme, die ich darüber hinzufüge. Im Falle von ImageViews, die auf dem OnTouchEvent false zurückgeben Die Ereignisse werden von der Schriftrolle konsumiert und der ViewSwiper hat keine Chance, die Seitenaufnahme zu ersetzen.

Also habe ich herausgefunden, dass die Rückgabe falscher OntouchEvent of the Scrollview die Eltern annehmen kann, dass es Ereignisse sind. Ich habe diese Unterklasse von Scrollview geschrieben, um es zu testen:

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;
    }
}

Wenn Sie false zurückgeben, müssen Sie jedoch weitere Ereignisse zum Elternteil versenden, aber ich benötige diese Ereignisse für vertikales Scrollen. Ich habe also die Idee, Fasten zurückzugeben, wenn sich der Benutzer horizontal bewegt, so sieht mein Code aus:

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: MOVEMENTRACKER wird nach einigen Ereignissen true zurückgegeben und erzählen, in welcher Richtung sich der Benutzer bewegt.

In diesem Fall erhält der Scrollview jedoch immer wieder Ereignisse, da sie bei den ersten Ereignissen zutreffend zurückgibt.

Alle Ideen, wie ich mit den Ereignissen auf dem Viewswiper umgehen kann, wenn es ein Kind ist, kehrt falsch zurück (auch wenn einige TRUUE zurückgegeben werden).

PS: Ich kann bei Bedarf mehr Informationen dazu geben und auch verschiedene Lösungen akzeptieren.

Basierend auf Antworten habe ich Folgendes ausprobiert:

@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;
}

Immer noch nichts.

War es hilfreich?

Lösung

Versuchen Sie das in onTouchEvent() der 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;

Aktualisieren

Bitte probieren Sie Folgendes zum benutzerdefinierten Scrollview aus

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

Und sonst nichts

Auf diese Weise gehe ich davon aus, dass der MotionEvent auf beiden Ansichten auftritt. Und da sie nicht konflikt

Andere Tipps

Basierend auf der Antwort von WeaPWire kam ich zu der folgenden Lösung:

Auf Viewswiper

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

Und auf Scrollhorizontal kehre ich bei DispatchTouchEvent false zurück, wenn ich es nicht mehr brauche.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top