滚动时的Android工具栏高程

我试图实现一个search栏像在谷歌地图android应用程序:

在这里输入图像说明

当回收站视图处于初始状态时,工具栏没有标高。 只有当用户开始滚动海拔变得可见。 而search栏(工具栏)永远不会崩溃。 这是我试图复制这个:

<android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.AppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="64dp"> <!-- content --> </android.support.v7.widget.Toolbar> </android.support.design.widget.AppBarLayout> </android.support.design.widget.CoordinatorLayout> 

在这里你可以看到结果:

在这里输入图像说明

所以我的解决scheme的问题是,工具栏的高程总是可见的。 但是,我希望它只在回收站视图在后面滚动时出现。 是否有任何devise支持库,使谷歌地图应用程序中看到这样的行为?

我在用

 com.android.support:appcompat-v7:23.2.0 com.android.support:design:23.2.0 

Solutions Collecting From Web of "滚动时的Android工具栏高程"

无论您是否使用CoordinatorLayoutRecyclerView.OnScrollListener看起来都是正确的方式。 但是,根据我的经验, recyclerview.getChild(0).getTop()不可靠, 应该用于确定滚动状态。 相反,这是什么工作:

 private static final int SCROLL_DIRECTION_UP = -1; // ... // Put this into your RecyclerView.OnScrollListener > onScrolled() method if (recyclerview.canScrollVertically(SCROLL_DIRECTION_UP) { // Remove elevation } else { // Show elevation } 

一定要将LayoutManager分配给您的RecyclerView否则canScrollVertically的调用可能会导致崩溃!

我在我的片段中有一个RecyclerView。 我可以使用下面的代码达到类似的效果:

这不是最聪明的方法,你可以等待更好的答案。

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Initial Elevation final Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); if(toolbar!= null) toolbar.setElevation(0); // get initial position final int initialTopPosition = mRecyclerView.getTop(); // Set a listener to scroll view mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if(toolbar!= null && mRecyclerView.getChildAt(0).getTop() < initialTopPosition ) { toolbar.setElevation(50); } else { toolbar.setElevation(0); } } }); }