使用Googledevise库如何隐藏FABbutton向下滚动?

Google已经发布了devise库,我正在使用

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

但是我不能看到如何使用这个库的代码示例,以及如何在滚动上animationFAB栏。 我想我可以监听ListView上的滚动事件,然后自己animationbutton,但是这不是烘烤到API(这不是这个支持库的点)。

有没有例子?

谢谢

Solutions Collecting From Web of "使用Googledevise库如何隐藏FABbutton向下滚动?"

如果您使用的是RecyclerView而您正在寻找简单的东西,那么可以试试这个:

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

通过用常数replace0 ,可以调整触发的灵敏度,提供更stream畅的体验

使用自定义的CoordinatorLayout.Behavior可以使组件对滚动事件做出反应,因为它们在覆盖onStartNestedScroll()时会自动接收滚动事件。

在此FABAwareScrollingViewBehavior中find的隐藏和显示FAB滚动的行为示例,构build于cheesesquare之上 :

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

你的滚动视图将有app:layout_behavior="com.support.android.designlibdemo.FABAwareScrollingViewBehavior"而不是app:layout_behavior="@string/appbar_scrolling_view_behavior"

但是,如果需要,可以用任何操作replacehide()show() 。 有关如何完成的详细信息可以在这篇文章和v22.2.1的后续文章以及v25.1.0的后续文章中find 。

请注意,这与devise库的所有滚动行为一样,要求您的视图支持嵌套滚动,它目前限制您使用NestedScrollView , RecyclerView – ListViewScrollView仅适用于API21 +设备。

使用CoordinatorLayout是最好的方法。 如果你想要将监听器附加到ListView或者RecyclerView,你也可以这样做。 我认为是更可定制的。 这是我在git集线器上的例子。

Github项目:用listview隐藏FAB(素材库)

在这里输入图像说明

我知道自己晚了,但如果有人来这里寻找答案,这一个为我工作。 是的, @TargetApi(23)是必需的,因为setOnScrollChangeListener()在22个API中不起作用。

 @TargetApi(23) void hideFabOnScroll(){ webView.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { if (scrollY > oldScrollY) fab.hide(); else if (scrollY < oldScrollY) fab.show(); } }); } 

@ianhanniballake工作正常,但onStartNestedScroll()onNestedScroll()方法已被弃用。 这里是更新的版本:

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

@ianhanniballake在这个主题上还有一个很好的post: 拦截一切与CoordinatorLayout行为