2016-03-01 85 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'會簡單地返回,這會讓你的代碼更好一些。 –