CoordinatorLayout的使用场景

快半年没有写博客了,想想自己还是够懒的,当然也很忙,但是这不能当做借口,从今天开始,要捡起这个好习惯,同时也是对自己技术的一个积累。

在今年的Google I/O 2015开发者大会上,谷歌正式发布了Android M,带来了很多新的东西,详细介绍大家可以看这里 Google I/O 2015 为 Android 开发者带来了哪些福利?,这里我想主要介绍下关于CoordinatorLayout的使用技巧。

CoordinatorLayout 顾名思义,它是用来组织它的子views之间协作的一个父view。CoordinatorLayout默认情况下可理解是一个FrameLayout,它的布局方式默认是一层一层叠上去。

CoordinatorLayout典型的使用场景有两种

场景一 如下图:

CoordinatorLayout_behavior_1

布局方式如下:

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

     <! -- Your Scrollable View -->
    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.Toolbar
              ...
              app:layout_scrollFlags="scroll|enterAlways">

        <android.support.design.widget.TabLayout
              ...
              app:layout_scrollFlags="scroll|enterAlways">
    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

有两个属性需要注意:

app:layout_behavior 这个属性是为了标识滚动行为的view

app:layout_scrollFlags 这个属性是为了标识 app:layout_behavior滚动时当前view的变化类型,它有4中类型,分别为:

  • scroll. : 所有想滚动出屏幕的view都需要设置这个flag- 没有设置这个flag的view将被固定在屏幕顶部。
  • enterAlways: 这个flag让任意向下的滚动都会导致该view变为可见,启用快速“返回模式”。
  • enterAlwaysCollapsed: 向上滑动,Toolbar不会固定在顶部
  • exitUntilCollapsed: 向上滚动时收缩View,但可以固定Toolbar一直在上面。

这里要说明一下,后面两个属性场景一是用不到的,主要用于场景二

场景二 如下图
CoordinatorLayout_behavior_2

布局方式如下:

<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.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/backdrop"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                android:scaleType="centerCrop"
                android:src="@drawable/ic_banner"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

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

    <android.support.v4.widget.NestedScrollView >
    ...   
    </android.support.v4.widget.NestedScrollView>


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

场景二比场景一要复杂些,滚到的效果当然也丰富些,这里又引入了一个view,CollapsingToolbarLayout,它的作用是提供了一个可以折叠的Toolbar,它继承至FrameLayout,给它设置layout_scrollFlags,它可以控制包含在CollapsingToolbarLayout中的控件(如:ImageView、Toolbar)在响应layout_behavior事件时作出相应的scrollFlags滚动事件(移除屏幕或固定在屏幕顶端)。

在ImageView控件中:

我们设置了:

layout_collapseMode (折叠模式) - 有两个值:

pin - 设置为这个模式时,当CollapsingToolbarLayout完全收缩后,Toolbar还可以保留在屏幕上。

parallax - 设置为这个模式时,在内容滚动时,CollapsingToolbarLayout中的View(比如ImageView)也可以同时滚动,实现视差滚动效果,通常和layout_collapseParallaxMultiplier(设置视差因子)搭配使用。

layout_collapseParallaxMultiplier(视差因子) - 设置视差滚动因子,值为:0~1。

在Toolbar控件中:

我们设置了layout_collapseMode(折叠模式):为pin。

综上分析:当设置了layout_behavior的控件响应起了CollapsingToolbarLayout中的layout_scrollFlags事件时,ImageView会有视差效果的向上滚动移除屏幕,当开始折叠时CollapsingToolbarLayout的背景色(也就是Toolbar的背景色)就会变为我们设置好的背景色,layout_scrollFlags设置为“scroll|exitUntilCollapsed“时,Toolbar一直会固定在最顶端,当设置为“scroll|exitUntilCollapsed“时,Toolbar也会滚出屏幕如下图

CoordinatorLayout_behavior_3