2016-03-01 19 views
8

tôi cố gắng thực hiện một thanh tìm kiếm như trong google maps ứng dụng android:Android toolbar cao khi di chuyển

enter image description here

Khi xem tái chế ở trạng thái ban đầu của nó, thanh công cụ không có độ cao. Chỉ khi người dùng bắt đầu cuộn, độ cao mới hiển thị. Và thanh tìm kiếm (thanh công cụ) không bao giờ sụp đổ. Dưới đây là những gì tôi đã cố gắng để tái tạo này:

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

Và ở đây bạn có thể xem kết quả:

enter image description here

Vì vậy, các vấn đề với giải pháp của tôi là, đó độ cao của thanh công cụ luôn luôn có thể nhìn thấy . Nhưng tôi muốn nó chỉ xuất hiện khi khung nhìn của người tái chế cuộn ra sau nó. Có bất kỳ thứ gì từ thư viện hỗ trợ thiết kế cho phép hành vi như được thấy trong ứng dụng bản đồ google không?

Tôi đang sử dụng

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

Bạn đã thử sử dụng CollapsingToolbarLayout chưa? –

Trả lời

13

Cho dù bạn đang sử dụng một CoordinatorLayout hay không, một RecyclerView.OnScrollListener có vẻ như đúng cách để đi xa như độ cao là có liên quan. Tuy nhiên, từ kinh nghiệm của tôi recyclerview.getChild(0).getTop() là không đáng tin cậy và nên không được sử dụng để xác định trạng thái cuộn. Thay vào đó, đây là những gì làm việc:

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 
} 

Hãy chắc chắn để gán một LayoutManager để bạn RecyclerView hoặc tiếng gọi của canScrollVertically có thể gây ra một vụ tai nạn!

+1

@DanielVeihelmann cảm ơn bạn đã giải quyết hoàn toàn vấn đề của tôi. –

3

Tôi có một RecyclerView trong đoạn tôi. Tôi có thể đạt được hiệu ứng tương tự bằng cách sử dụng mã bên dưới:

Đó không phải là cách thông minh nhất và bạn có thể chờ câu trả lời tốt hơn.

@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

có vẻ tốt, cảm ơn bạn. Bạn nghĩ rằng điều này là không thể chỉ với xml? –

+0

Tôi nghĩ rằng nó không phải là chỉ có thể bằng XML .. DefaultBahevior cho thanh công cụ không liên quan đến độ cao (nhưng để chiều cao của nó). Ngay cả khi bạn tìm thấy một cách để sử dụng CoordinatorLayout, tôi nghĩ rằng bạn sẽ cần một số mã ... Tôi sẽ cố gắng để đạt được hiệu quả tương tự chỉ sử dụng CoordinatorLayout .. Tôi sẽ chia sẻ càng sớm càng tốt – W0rmH0le

+0

Gần như hoàn hảo, 'canScrollVertically' là những gì bạn đang tìm kiếm trong OnScrollListener của bạn (xem câu trả lời của tôi). Bên cạnh đó, chỉ cần trả về nếu 'toolbar == null' trước khi gọi addOnScrollListener() sẽ làm cho mã của bạn trở nên tốt hơn một chút IMHO. –

Các vấn đề liên quan