一文徹底搞懂CoordinatorLayout 和 AppbarLayout 聯(lián)動(dòng)

ConstainLayout CoordinatorLayout AppbarLayout CollapsingToolbarLayout 我擦,有點(diǎn)蒙,穩(wěn)住,我們能贏。

1. ConstainLayout

約束布局,和后面幾個(gè)沒有任何聯(lián)系

2.CoordinatorLayout

CoordinatorLayout 是一個(gè) “加強(qiáng)版” FrameLayout, 它主要有兩個(gè)用途:

  1. 用作應(yīng)用的頂層布局管理器,也就是作為用戶界面中所有 UI 控件的容器;
  2. 用作相互之間具有特定交互行為的 UI 控件的容器,通過為 CoordinatorLayout 的子 View 指定 Behavior, 就可以實(shí)現(xiàn)它們之間的交互行為。 Behavior 可以用來(lái)實(shí)現(xiàn)一系列的交互行為和布局變化,比如說側(cè)滑菜單、可滑動(dòng)刪除的 UI 元素,以及跟隨著其他 UI 控件移動(dòng)的按鈕等。
      
    其實(shí)總結(jié)出來(lái)就是 CoordinatorLayout 是一個(gè)布局管理器,相當(dāng)于一個(gè)增強(qiáng)版的 FrameLayout,但是它神奇在于可以實(shí)現(xiàn)它的子 View 之間的交互行為。

3.AppBarLayout

AppBarLayout 是一個(gè)垂直的 LinearLayout,實(shí)現(xiàn)了 Material Design 中 App bar 的 Scrolling Gestures 特性。AppBarLayout 的子 View 應(yīng)該聲明想要具有的“滾動(dòng)行為”,這可以通過 layout_scrollFlags 屬性或是 setScrollFlags() 方法來(lái)指定。

AppBarLayout 只有作為 CoordinatorLayout 的直接子 View 時(shí)才能正常工作,為了讓 AppBarLayout 能夠知道何時(shí)滾動(dòng)其子 View,我們還應(yīng)該在 CoordinatorLayout 布局中提供一個(gè)可滾動(dòng) View,我們稱之為 Scrolling View。

Scrolling View 和 AppBarLayout 之間的關(guān)聯(lián),通過將 Scrolling View 的 Behavior 設(shè)為 AppBarLayout.ScrollingViewBehavior 來(lái)建立。

AppBarLayout + CoordinatorLayout使用
demo1.gif
demo1.gif
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:layout_width="match_parent"
            android:id="@+id/toolbar"
            android:title="AppBarLayout"
            app:layout_scrollFlags="scroll|enterAlways"
            android:layout_height="wrap_content"></android.support.v7.widget.Toolbar>


    </android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:id="@+id/recycler"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>

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

4.CollapsingToolbarLayout

CollapsingToolbarLayout 通常用來(lái)在布局中包裹一個(gè) Toolbar,以實(shí)現(xiàn)具有“折疊效果“”的頂部欄。它需要是 AppBarLayout 的直接子 View,這樣才能發(fā)揮出效果。
CollapsingToolbarLayout包含以下特性:

  • Collasping title(可折疊標(biāo)題):當(dāng)布局完全可見時(shí),這個(gè)標(biāo)題比較大;當(dāng)折疊起來(lái)時(shí),標(biāo)題也會(huì)變小。標(biāo)題的外觀可以通過 expandedTextAppearance 和 collapsedTextAppearance 屬性來(lái)調(diào)整。
  • Content scrim(內(nèi)容紗布):根據(jù) CollapsingToolbarLayout 是否滾動(dòng)到一個(gè)臨界點(diǎn),內(nèi)容紗布會(huì)顯示或隱藏??梢酝ㄟ^ setContentScrim(Drawable) 來(lái)設(shè)置內(nèi)容紗布。
    Status bar scrim(狀態(tài)欄紗布):也是根據(jù)是否滾動(dòng)到臨界點(diǎn),來(lái)決定是否顯示??梢酝ㄟ^ setStatusBarScrim(Drawable) 方法來(lái)設(shè)置。這個(gè)特性只有在 Android 5.0 及其以上版本,我們?cè)O(shè)置 fitSystemWindows 為 ture 時(shí)才能生效。
  • Parallax scrolling children(視差滾動(dòng)子 View):子 View 可以選擇以“視差”的方式來(lái)進(jìn)行滾動(dòng)。(視覺效果上就是子 View 滾動(dòng)的比其他 View 稍微慢些)
  • Pinned position children:子 View 可以選擇固定在某一位置上。
demo2.gif
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="256dp"
        android:fitsSystemWindows="true">
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="#30469b"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                android:src="@mipmap/ic_launcher"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.7"  />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin" />
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"></android.support.v7.widget.RecyclerView>


</android.support.design.widget.CoordinatorLayout>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容