2015-06-01 41 views
10

我想要達到類似的效果,您可以在Google Play商店中看到類似的效果,其中滾動內容Toolbar在您滾動時不在屏幕上。在#io15推出,但是CoordinatorLayout:隱藏/顯示半可見工具欄?

也能正常工作與CoordinatorLayout1):如果停止滾動「中途」工具欄仍然在屏幕上,但減少了一半:我想它動畫關閉就像在Google Play商店中一樣。 我該如何做到這一點?

回答

3

現在Android支持庫23.1.0有一個新的滾動標誌SCROLL_FLAG_SNAP它可以讓你實現這種效果。

AppBarLayout支持許多滾動標誌,這些滾動標誌會影響子視圖對滾動的反應(例如滾動屏幕)。此版本新增SCROLL_FLAG_SNAP,確保滾動結束時視圖不會部分可見。相反,它會滾動到最近的邊緣,完全可見或滾動完全離開屏幕。

1

活動佈局文件:

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingTop="?attr/actionBarSize" 
     android:clipToPadding="false"/> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary"/> 

</FrameLayout> 

現在的活動中,設置工具欄和RecyclerView。指定OnScrollListener到RecyclerView

recyclerView.setOnScrollListener(new MyScrollListener(this)); 

從RecyclerView.OnScrollListener擴展MyScrollListerner。

public abstract class MyScrollListener extends RecyclerView.OnScrollListener { 

    private static final float TOOLBAR_HIDE_THRESHOLD = 10; 
    private static final float TOOLBAR_SHOW_THRESHOLD = 70; 

    private int mToolbarOffset = 0; 
    private boolean mControlsVisible = true; 
    private int mToolbarHeight; 
    private int mTotalScrolledDistance; 

    public MyScrollListener(Context context) { 

     final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes(
       new int[]{R.attr.actionBarSize}); 
     mToolbarHeight = (int) styledAttributes.getDimension(0, 0); 
     styledAttributes.recycle(); 

     return toolbarHeight; 
     mToolbarHeight = Utils.getToolbarHeight(context); 
    } 

    @Override 
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
     super.onScrollStateChanged(recyclerView, newState); 

     if(newState == RecyclerView.SCROLL_STATE_IDLE) { 
      if(mTotalScrolledDistance < mToolbarHeight) { 
       setVisible(); 
      } else { 
       if (mControlsVisible) { 
        if (mToolbarOffset > TOOLBAR_HIDE_THRESHOLD) { 
         setInvisible(); 
        } else { 
         setVisible(); 
        } 
       } else { 
        if ((mToolbarHeight - mToolbarOffset) > TOOLBAR_SHOW_THRESHOLD) { 
         setVisible(); 
        } else { 
         setInvisible(); 
        } 
       } 
      } 
     } 
    } 

     @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     super.onScrolled(recyclerView, dx, dy); 
     clipToolbarOffset(); 
     onMoved(mToolbarOffset); 

     if((mToolbarOffset <mToolbarHeight && dy>0) || (mToolbarOffset >0 && dy<0)) { 
      mToolbarOffset += dy; 
     } 
     if (mTotalScrolledDistance < 0) { 
      mTotalScrolledDistance = 0; 
     } else { 
      mTotalScrolledDistance += dy; 
     } 
    } 

    private void clipToolbarOffset() { 
    if(mToolbarOffset > mToolbarHeight) { 
     mToolbarOffset = mToolbarHeight; 
     } else if(mToolbarOffset < 0) { 
      mToolbarOffset = 0; 
     } 
    } 

    private void setVisible() { 
     if(mToolbarOffset > 0) { 
      onShow(); 
      mToolbarOffset = 0; 
     } 
     mControlsVisible = true; 
    } 

    private void setInvisible() { 
     if(mToolbarOffset < mToolbarHeight) { 
      onHide(); 
      mToolbarOffset = mToolbarHeight; 
     } 
     mControlsVisible = false; 
    } 

    public abstract void onMoved(int distance); 
    public abstract void onShow(); 
    public abstract void onHide(); 
} 
+0

@zoltish請讓我知道這是否適用於您,並接受作爲答案,如果它。 :) – nishantapatil

+0

應用欄/工具欄可以在不滾動RecyclerView的情況下滾動,在這種情況下,監聽器代碼將不會被觸發。這種情況發生在RecyclerView位於頂部並且無法向上滾動時,並且用戶拉下來,這將導致整個CoordinatorLayout的滾動 – marmor

0

重寫AppBarLayout似乎是一個更好的解決方案,因爲有兩種可能的滾動事件 - 整個CoordinatorLayout的,和的RecyclerView/NestedScrollView

看到這個答案作爲一個可能的工作代碼: https://stackoverflow.com/a/32110089/819355