2016-03-01 86 views
8

当我试图执行一个搜索栏像在谷歌地图Android应用:Android的工具栏滚动海拔

enter image description here

当回收的观点是在它的初始状态时,工具栏没有高程。只有当用户开始滚动海拔时才可见。搜索栏(工具栏)永不崩溃。这里是我试图复制此:

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

在这里你可以看到结果:

enter image description here

所以我的解决方案的问题是,该工具栏的高度总是可见。但是我希望它只在回收站视图在后面滚动时出现。是否有设计支持库中的任何内容能够支持谷歌地图应用中出现的这种行为?

我使用

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

您是否尝试过使用CollapsingToolbarLayout? –

回答

13

无论您使用的是CoordinatorLayout与否,RecyclerView.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 
} 

一定要分配LayoutManagerRecyclerViewcanScrollVertically的调用可能会导致崩溃!

+1

@DanielVeihelmann谢谢你完美的解决了我的问题。 –

3

我有我的片段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); 
      } 
     } 
    }); 
} 
+0

看起来不错,谢谢。你认为这是不可能的只是XML? –

+0

我认为这是不可能的只有XML ..工具栏的DefaultBahevior是无关的高程(但其高度)。即使你找到一种方法来使用CoordinatorLayout,我想你会需要一些代码...我只会尝试使用CoordinatorLayout来达到同样的效果。我会尽快分享 – W0rmH0le

+0

几乎完美,canScrollVertically是什么你正在寻找你的OnScrollListener(见我的答案)。 此外,如果在调用addOnScrollListener()之前调用'toolbar == null'会简单地返回,这会让你的代码更好一些。 –