Material Design学习:CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout

简介

Coordinator 美[koʊ'ɔ:dənˌeɪtə] 协调

CoordinatorLayout是支持包"com.Android.support:design"里很重要的一个控件,继承于FrameLayout,它提供了两个主要用途:

  1. 作为APP的顶层布局;
  2. 协调子控件的相互作用;

使用

一. 收缩ToolBar

  • 效果展示
效果展示
  • 布局代码
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="zhj.tablayoutdemo.MainActivity">
 
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        >
 
        <android.support.v7.widget.Toolbar
            android:id="@+id/mToolBar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways|snap"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
 
        <android.support.design.widget.TabLayout
            android:id="@+id/tab_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#EF8D11"
            app:tabGravity="fill"
            app:tabIndicatorColor="#f00"
            app:tabIndicatorHeight="4dp"
            app:tabMode="fixed"
            app:tabSelectedTextColor="#FFFFFF"
            app:tabTextColor="#FFFFFF"
            >
        </android.support.design.widget.TabLayout>
    </android.support.design.widget.AppBarLayout>
 
    <android.support.v4.view.ViewPager
        android:id="@+id/vp_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >
    </android.support.v4.view.ViewPager>
 
</android.support.design.widget.CoordinatorLayout>

布局中的viewpager、tablayout、toolbar的使用可以参考以下文章。
Material Design学习:TabLayout+Viewpager制作一个标签页
Material Design学习:ToolBar 开发使用简介

注意事项

  • CoordinatorLayout作为顶层视图;
  • AppBarLayout包裹toolbar和tablayout;

AppBarLayout 是继承LinerLayout实现的一个ViewGroup容器组件,
默认的AppBarLayout是垂直方向的, 可以管理其中的控件在内容滚动时的行为。

我们可以通过设置layout_scrollFlags参数,来控制AppBarLayout中控件的行为。

  1. 设置Toolbar的滚动标志
    app:layout_scrollFlags="scroll|enterAlways|snap"

layout_scrollFlags参数

  • scroll: 和其他控件滑动联动的基础,下面的其他属性值,先要设置了scroll后才有效果!
  • enterAlways:当屏幕下滑时,设置了这个行为的控件(比如toolbar)就会立马滑回屏幕,类似于快速返回的效果,而且不管下面的滑动组件(比如ScrollView是否正在滑动) 。
  • enterAlwaysCollapsed:是enterAlways的附加选项,一般跟enterAlways一起使用。控件首先是enterAlways效果,但只能滑动minHeight的距离。直到下面的滑动组件(比如ScrollView完全展示时),控件才能继续向下滑动。
  • exitUntilCollapsed:向上滑动的时候这个控件会收缩,但最多只能收缩到控件设定的minHeight,实际能滚动的距离为(layout_height-minHeight)。
  • snap:这个属性让控件变得有弹性,如果控件(比如toolbar)显示了75%的高度,就会显示出来,如果只有25%显示,就会隐藏。

给ViewPager设置行为,实现与AppBarLayout联动。
app:layout_behavior="@string/appbar_scrolling_view_behavior"

CoordinatorLayout不能和很多控件一起使用,比如要是内容部分放ListView,就算设置了layout_behavior也没用,取而代之使用RecyclerView或者NestedScrollView。

NestedScrollView就像scrollView,不过相比之下他更兼容新老版本的控件,更好的与后面的控件包括CoordinatorLayout配合使用.


二. 滚动折叠CollapsingToolbarLayout

collapsing 美[kə'læpsɪŋ] 折叠

CollapsingToolbarLayout作用是提供了一个可以折叠的Toolbar,它继承自FrameLayout。
给它设置layout_scrollFlags,可以控制它包裹的控件(如:ImageView、Toolbar)在响应layout_behavior事件时作出相应的scrollFlags滚动事件。

  • 效果展示
效果
  • 布局代码
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="zhj.tablayoutdemo.MainActivity">
 
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        >
 
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_tool_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:collapsedTitleGravity="center"
            app:contentScrim="@color/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">
 
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="250dp"
                android:scaleType="centerCrop"
                android:src="@mipmap/pic"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.8"/>
 
            <android.support.v7.widget.Toolbar
                android:id="@+id/mToolBar"
                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>
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
 
        <android.support.design.widget.TabLayout
            android:id="@+id/tab_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#EF8D11"
            app:tabGravity="fill"
            app:tabIndicatorColor="#f00"
            app:tabIndicatorHeight="4dp"
            app:tabMode="fixed"
            app:tabSelectedTextColor="#FFFFFF"
            app:tabTextColor="#FFFFFF"
            >
        </android.support.design.widget.TabLayout>
 
        <android.support.v4.view.ViewPager
            android:id="@+id/vp_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
        </android.support.v4.view.ViewPager>
    </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

Google官方文档翻译
CollapsingToolbarLayout包含以下功能:

  1. 折叠Title(Collapsing title):当布局内容全部显示出来时,title是最大的,但是随着View逐步移出屏幕顶部,title变得越来越小。你可以通过调用setTitle函数来设置title。
  2. 内容纱布(Content scrim):根据滚动的位置是否到达一个阀值,来决定是否对View“盖上纱布”。可以通过setContentScrim(Drawable)来设置纱布的图片.
  3. 状态栏纱布(Status bar scrim):根据滚动位置是否到达一个阀值决定是否对状态栏“盖上纱布”,你可以通过setStatusBarScrim(Drawable)来设置纱布图片,但是只能在LOLLIPOP设备上面有作用。
  4. 视差滚动子View(Parallax scrolling children):子View可以选择在当前的布局当时是否以“视差”的方式来跟随滚动。(PS:其实就是让这个View的滚动的速度比其他正常滚动的View速度稍微慢一点)。将布局参数app:layout_collapseMode设为parallax
  5. 将子View位置固定(Pinned position children):子View可以选择是否在全局空间上固定位置,这对于Toolbar来说非常有用,因为当布局在移动时,可以将Toolbar固定位置而不受移动的影响。 将app:layout_collapseMode设为pin。

| CollapsingToolbarLayout属性 | 含义 |
| -------- | ----- | ---- |
|app:title|设置标题|
|app:collapsedTitleGravity="center"|设置标题位置|
|app:contentScrim |设置折叠时toolbar的颜色,默认是colorPrimary的色值|
|app:statusBarScrim | 设置折叠时状态栏的颜色 ,默认是colorPrimaryDark的色值|
|app:layout_collapseParallaxMultiplier|设置视差|
|app:layout_collapseMode="parallax"| 视差模式,在折叠的时候会有个视差折叠的效果|
|app:layout_collapseMode="pin"|固定模式,在折叠的时候最后固定在顶端 |

步骤详解

  1. 编写 CollapsingToolbarLayout的两个子视图,一个是Imageview,一个Toolbar
  2. 为 CollapsingToolbarLayout 指定属性
    app:layout_scrollFlags="scroll|exitUntilCollapsed"
  3. 为ImageView 指定属性,声明它是可以折叠的
    app:layout_collapseMode="parallax"
  4. 为 toobar指定属性,声明它是固定的
    app:layout_collapseMode="pin"
  5. 为 CollapsingToolbarLayout 所在的父布局(view)指定属性,以声明它适配当前窗体
    android:fitsSystemWindows="true"

这里是项目地址

参考
http://blog.csdn.net/huachao1001/article/details/51558835
http://blog.csdn.net/rosechan/article/details/51587058
http://blog.csdn.net/github_35180164/article/details/51870301

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容