Android 中AppBarLayout的五種ScrollFlags

ScrollFlags共有五種常量值供AppBarLayout的Children View使用,在xml佈局文件中通過app:layout_scrollFlags設置,對應的值爲:scroll,enterAlways,enterAlwaysCollapsed,snap,exitUntilCollapsed;也可以在代碼中通過setScrollFlags(int)方法使用,比如:

Toolbar toolbar = ... // your toolbar within an AppBarLayout
AppBarLayout.LayoutParams params = 
    (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
    | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);

下面我們通過官網介紹、XML代碼和對應的效果圖分別分析這五種值的使用(備註:代碼中設置也一樣,不再贅述):

scroll


The view will be scroll in direct relation to scroll events. This flag needs to be set for any of the other flags to take effect. If any sibling views before this one do not have this flag, then this value has no effect.

Child View 伴隨着滾動事件而滾出或滾進屏幕。注意兩點:第一點,如果使用了其他值,必定要使用這個值才能起作用;第二點:如果在這個child View前面的任何其他Child View沒有設置這個值,那麼這個Child View的設置將失去作用。

示例XML代碼:

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/tb_toolbar"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_56"
            app:titleTextColor="@color/white"
            app:title="@string/app_name"
            app:theme="@style/OverFlowMenuTheme"
            app:popupTheme="@style/AppTheme"
            android:background="@color/blue"
            app:layout_scrollFlags="scroll|enterAlways"/>

    </android.support.design.widget.AppBarLayout>

對應效果圖:

Samples01.gif

enterAlways


When entering (scrolling on screen) the view will scroll on any downwards scroll event, regardless of whether the scrolling view is also scrolling. This is commonly referred to as the 'quick return' pattern.

快速返回模式。其實就是向下滾動時Scrolling View和Child View之間的滾動優先級問題。對比scrollscroll | enterAlways設置,發生向下滾動事件時,前者優先滾動Scrolling View,後者優先滾動Child View,當優先滾動的一方已經全部滾進屏幕之後,另一方纔開始滾動。

示例XML代碼:

...
app:layout_scrollFlags="scroll|enterAlways"
...

對應效果圖:

Samples02.gif

enterAlwaysCollapsed


An additional flag for 'enterAlways' which modifies the returning view to only initially scroll back to it's collapsed height. Once the scrolling view has reached the end of it's scroll range, the remainder of this view will be scrolled into view. The collapsed height is defined by the view's minimum height.

enterAlways的附加值。這裏涉及到Child View的高度和最小高度,向下滾動時,Child View先向下滾動最小高度值,然後Scrolling View開始滾動,到達邊界時,Child View再向下滾動,直至顯示完全。

示例XML代碼:

...
android:layout_height="@dimen/dp_200"
android:minHeight="@dimen/dp_56"
...
app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
...

對應效果圖:

Samples03.gif

exitUntilCollapsed


When exiting (scrolling off screen) the view will be scrolled until it is 'collapsed'. The collapsed height is defined by the view's minimum height.

這裏也涉及到最小高度。發生向上滾動事件時,Child View向上滾動退出直至最小高度,然後Scrolling View開始滾動。也就是,Child View不會完全退出屏幕。

示例SML代碼:

...
android:layout_height="@dimen/dp_200"
android:minHeight="@dimen/dp_56"
...
app:layout_scrollFlags="scroll|exitUntilCollapsed"
...

對應效果圖:

Samples04.gif

snap


Upon a scroll ending, if the view is only partially visible then it will be snapped and scrolled to it's closest edge. For example, if the view only has it's bottom 25% displayed, it will be scrolled off screen completely. Conversely, if it's bottom 75% is visible then it will be scrolled fully into view.

簡單理解,就是Child View滾動比例的一個吸附效果。也就是說,Child View不會存在局部顯示的情況,滾動Child View的部分高度,當我們鬆開手指時,Child View要麼向上全部滾出屏幕,要麼向下全部滾進屏幕,有點類似ViewPager的左右滑動。

示例XML代碼:

...
android:layout_height="@dimen/dp_200"
...
app:layout_scrollFlags="scroll|snap"
...

對應效果圖:

Samples05.gif


作者:亦楓
鏈接:http://www.jianshu.com/p/7caa5f4f49bd
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章