it-swarm.com.de

Verwenden der Google Design Library zum Ausblenden der FAB-Schaltfläche in Nach unten scrollen?

Google hat die Design-Bibliothek veröffentlicht, die ich verwende

 compile 'com.Android.support:design:22.2.1'

Ich kann jedoch keine Codebeispiele für die Verwendung dieser Bibliothek und die Animation der FAB -Leiste beim Scrollen sehen. Ich schätze, ich kann auf Scroll-Ereignisse auf dem ListView warten und dann die Schaltfläche selbst animieren, aber ist dies nicht in die API eingebunden (ist dies nicht der Sinn dieser Unterstützungsbibliothek).

Gibt es Beispiele dafür?

38
drlobo

Wenn Sie RecyclerView verwenden und nach etwas Einfachem suchen, können Sie Folgendes versuchen:

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy){
            if (dy > 0)
                fabAddNew.hide();
            else if (dy < 0)
                fabAddNew.show();
        }
    });

Durch Ersetzen 0 Mit einer Konstante können Sie die Triggerempfindlichkeit einstellen, um ein gleichmäßigeres Erlebnis zu erzielen

93
tochkov

Das Reagieren einer Komponente auf Bildlaufereignisse ist mit einem benutzerdefinierten CoordinatorLayout.Behavior am einfachsten, da sie Bildlaufereignisse automatisch empfangen, wenn Sie onStartNestedScroll () überschreiben.

Ein Beispielverhalten, bei dem die FAB-Funktion in diesem FABAwareScrollingViewBehavior ausgeblendet und angezeigt wird, das auf Käsequadrat aufgebaut ist:

public class FABAwareScrollingViewBehavior
    extends AppBarLayout.ScrollingViewBehavior {
  public FABAwareScrollingViewBehavior(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  @Override
  public boolean layoutDependsOn(CoordinatorLayout parent,
      View child, View dependency) {
    return super.layoutDependsOn(parent, child, dependency) ||
            dependency instanceof FloatingActionButton;
  }

  @Override
  public boolean onStartNestedScroll(
      final CoordinatorLayout coordinatorLayout, final View child,
      final View directTargetChild, final View target,
      final int nestedScrollAxes) {
    // Ensure we react to vertical scrolling
    return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL
            || super.onStartNestedScroll(coordinatorLayout, child,
               directTargetChild, target, nestedScrollAxes);
  }

  @Override
  public void onNestedScroll(
      final CoordinatorLayout coordinatorLayout, final View child,
      final View target, final int dxConsumed, final int dyConsumed,
      final int dxUnconsumed, final int dyUnconsumed) {
    super.onNestedScroll(coordinatorLayout, child, target,
      dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
    if (dyConsumed > 0) {
      // User scrolled down -> hide the FAB
      List<View> dependencies = coordinatorLayout.getDependencies(child);
      for (View view : dependencies) {
        if (view instanceof FloatingActionButton) {
          ((FloatingActionButton) view).hide();
        }
      }
    } else if (dyConsumed < 0) {
      // User scrolled up -> show the FAB
      List<View> dependencies = coordinatorLayout.getDependencies(child);
      for (View view : dependencies) {
        if (view instanceof FloatingActionButton) {
          ((FloatingActionButton) view).show();
        }
      }
    }
  }
}

Wo Ihre Bildlauf-Ansicht hätte app:layout_behavior="com.support.Android.designlibdemo.FABAwareScrollingViewBehavior" Anstelle von app:layout_behavior="@string/appbar_scrolling_view_behavior"

Sie können jedoch hide() und show() durch eine beliebige Aktion ersetzen, wenn Sie dies möchten. Details dazu finden Sie in dieser Post und Follow-up-Post für v22.2.1 und Follow-up-Post für v25.1. =.

Beachten Sie, dass dies, wie bei allen Bildlaufverhalten der Konstruktionsbibliothek, voraussetzt, dass Ihre Ansicht den verschachtelten Bildlauf unterstützt, der Sie derzeit auf NestedScrollView , RecyclerView - ListView beschränkt. und ScrollView funktionieren nur auf API21 + -Geräten.

45
ianhanniballake

Wenn du bist NICHT Verwenden einer RecycleView (dh nur normal) ScrollView) dies wird den Trick machen:

mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            if (mScrollView.getScrollY() > oldScrollYPostion) {
                fab.hide();
            } else if (mScrollView.getScrollY() < oldScrollYPostion || mScrollView.getScrollY() <= 0) {
                fab.show();
            }
            oldScrollYPostion = mScrollView.getScrollY();
        }
    });

Vergessen Sie nicht zu deklarieren:

private int oldScrollYPostion = 0;

in deiner Klasse.

8
BelfDev

Die Verwendung von CoordinatorLayout ist der beste Weg. Wenn Sie Listener an ListView oder RecyclerView anhängen möchten, können Sie dies auch tun. Ich denke ist anpassbarer. Hier ist mein Beispiel für Git Hub.

Github-Projekt: FAB (Materialbibliothek) mit Listenansicht ausblenden

enter image description here

2
febaisi

Die @ianhanniballake funktioniert einwandfrei, aber die Methoden onStartNestedScroll() und onNestedScroll() sind veraltet. Hier ist die aktualisierte Version:

public class FabAwareScrollingViewBehavior extends AppBarLayout.ScrollingViewBehavior {

    public FabAwareScrollingViewBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        return super.layoutDependsOn(parent, child, dependency) ||
                dependency instanceof FloatingActionButton;
    }

    @Override
    public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout,
                                       @NonNull View child, @NonNull View directTargetChild,
                                       @NonNull View target, int axes, int type) {
        // Ensure we react to vertical scrolling
        return axes == ViewCompat.SCROLL_AXIS_VERTICAL ||
                super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type);
    }

    @Override
    public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout,
                                  @NonNull View child, @NonNull View target, int dx, int dy,
                                  @NonNull int[] consumed, int type) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);

        if (dy > 0) {
            // User scrolled down -> hide the FAB
            List<View> dependencies = coordinatorLayout.getDependencies(child);
            for (View view : dependencies) {
                if (view instanceof FloatingActionButton) {
                    ((FloatingActionButton) view).hide();
                }
            }
        } else if (dy < 0) {
            // User scrolled up -> show the FAB
            List<View> dependencies = coordinatorLayout.getDependencies(child);
            for (View view : dependencies) {
                if (view instanceof FloatingActionButton) {
                    ((FloatingActionButton) view).show();
                }
            }
        }
    }
}

Es gibt auch einen sehr guten Beitrag von @ianhanniballake zu diesem Thema: Abfangen von allem mit CoordinatorLayout Behaviors

2
vovahost
recyclerView.setOnFlingListener(new RecyclerView.OnFlingListener() {
    @Override
    public boolean onFling(int velocityX, int velocityY) {
        if (velocityY < 0)
            mScrollCallbacks.showUI();
            //Code to hide the UI, I have  a custom one that slides down the nav  bar and the fab
        else if (velocityY > 0)
            mScrollCallbacks.hideUI();
            //Code to show the UI

        return false;
    }
});

Das funktioniert sehr gut

2
MicroRJ