Android 詳細(xì)分析AppBarLayout的五種ScrollFlags

在前面兩篇MD系列的文章中,通過(guò)兩個(gè)案例基本上能夠掌握了CoordinatorLayout與AppBarLayout的配合使用。本文我們回過(guò)頭來(lái)詳細(xì)聊聊AppBarLayout的ScrollFlags屬性,了解一下不同值之間的區(qū)別。至此,Android Material Design系列的學(xué)習(xí)已進(jìn)行到第七篇,大家可以點(diǎn)擊以下鏈接查看之前的文章:

ScrollFlags共有五種常量值供AppBarLayout的Children View使用,在xml布局文件中通過(guò)app:layout_scrollFlags設(shè)置,對(duì)應(yīng)的值為:scroll,enterAlways,enterAlwaysCollapsed,snap,exitUntilCollapsed;也可以在代碼中通過(guò)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);

下面我們通過(guò)官網(wǎng)介紹、XML代碼和對(duì)應(yīng)的效果圖分別分析這五種值的使用(備注:代碼中設(shè)置也一樣,不再贅述):

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 伴隨著滾動(dòng)事件而滾出或滾進(jìn)屏幕。注意兩點(diǎn):第一點(diǎn),如果使用了其他值,必定要使用這個(gè)值才能起作用;第二點(diǎn):如果在這個(gè)child View前面的任何其他Child View沒(méi)有設(shè)置這個(gè)值,那么這個(gè)Child View的設(shè)置將失去作用。

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

對(duì)應(yīng)效果圖:

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.

快速返回模式。其實(shí)就是向下滾動(dòng)時(shí)Scrolling View和Child View之間的滾動(dòng)優(yōu)先級(jí)問(wèn)題。對(duì)比scrollscroll | enterAlways設(shè)置,發(fā)生向下滾動(dòng)事件時(shí),前者優(yōu)先滾動(dòng)Scrolling View,后者優(yōu)先滾動(dòng)Child View,當(dāng)優(yōu)先滾動(dòng)的一方已經(jīng)全部滾進(jìn)屏幕之后,另一方才開(kāi)始滾動(dòng)。

示例XML代碼:

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

對(duì)應(yīng)效果圖:

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的高度和最小高度,向下滾動(dòng)時(shí),Child View先向下滾動(dòng)最小高度值,然后Scrolling View開(kāi)始滾動(dòng),到達(dá)邊界時(shí),Child View再向下滾動(dòng),直至顯示完全。

示例XML代碼:

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

對(duì)應(yīng)效果圖:

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.

這里也涉及到最小高度。發(fā)生向上滾動(dòng)事件時(shí),Child View向上滾動(dòng)退出直至最小高度,然后Scrolling View開(kāi)始滾動(dòng)。也就是,Child View不會(huì)完全退出屏幕。

示例SML代碼:

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

對(duì)應(yīng)效果圖:

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.

簡(jiǎn)單理解,就是Child View滾動(dòng)比例的一個(gè)吸附效果。也就是說(shuō),Child View不會(huì)存在局部顯示的情況,滾動(dòng)Child View的部分高度,當(dāng)我們松開(kāi)手指時(shí),Child View要么向上全部滾出屏幕,要么向下全部滾進(jìn)屏幕,有點(diǎn)類似ViewPager的左右滑動(dòng)。

示例XML代碼:

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

對(duì)應(yīng)效果圖:

Samples05.gif

示例源碼


我在GitHub上建立了一個(gè)Repository,用來(lái)存放整個(gè)Android Material Design系列控件的學(xué)習(xí)案例,會(huì)伴隨著文章逐漸更新完善,歡迎大家補(bǔ)充交流,Star地址:

https://github.com/Mike-bel/MDStudySamples

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,898評(píng)論 2 45
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評(píng)論 25 708
  • 最新項(xiàng)目中用到了些Material效果,在此對(duì)自己的學(xué)習(xí)做個(gè)小結(jié)。 首先養(yǎng)成良好的學(xué)習(xí)習(xí)慣-----看源碼: Co...
    風(fēng)少俠閱讀 4,941評(píng)論 5 37
  • 二人安置好蘇沐秋,不約而同看了對(duì)方,葉修嘆了口氣:“出去說(shuō)吧。” 來(lái)到最近的休息室,葉修感到一陣壓迫。 “為什么要...
    妗如十歌閱讀 304評(píng)論 0 0
  • 昨天忙著備課,臨睡前刷朋友圈,嬌嬌曬了自己的新家。 家鄉(xiāng)市區(qū)最繁華地段的房子,精裝,家具件件精良。配以文字:終于有...
    北方有萱草閱讀 725評(píng)論 14 7

友情鏈接更多精彩內(nèi)容