CoordinatorLayout 学习(一) - CoordinatorLayout的基本使用

  最近忙完了学校的事情,终于又成功的跑去公司上班了(还好公司没有嫌弃我菜😂😂)。在学校废了半年多,感觉好多东西都不太会了,所以觉得自己应该找点事情来做,于是选中学习CoordinatorLayout。其实在昨年,我就对CoordinatorLayout进行了简单的学习,不过当时学习的重点放在了嵌套滑动,从而未对CoordinatorLayout进行深入和系统的学习,这个也算是昨年留下的一个遗憾。因此,我觉得还是应该弥补一下。
  楼主写一个系列文章来详细的介绍CoordinatorLayout,分别会介绍它的基本使用,Behavior的原理解析以及自定义,最后就是CoordinatorLayout的扩展,这部分的内容不固定,篇幅也不固定。
  本文参考文章

  1. CoordinatorLayout使用详解: 打造折叠悬浮效果

1. 概述

  作为本系列文章第一篇文章,我觉得还是有必要简单介绍一下CoordinatorLayout
  CoordinatorLayout顾名思义,协调者布局。所谓的协调者布局,它主要是协调谁,协调啥呢?我相信大家在学这个布局时,都会思考这两个问题。其实说的简单点,协调者布局主要协调child之间的联动。请注意我的措辞,child之间的联动。
  可能有的同学对联动还是有点陌生,我简单的举一个例子,比如说,我们在滑动一个RecyclerView,存在一个View需要在RecyclerView滑动时做相应的动作,例如,位移变化,缩放变化等等。我相信这种场景还是非常常见的吧。这种场景就可以称之为child之间联动。
  而CoordinatorLayout是怎么进行协调呢?主要依靠一个插件--Behavior。在CoordinatorLayout内部,每个child都必须带一个Behavior(其实不携带也行,不携带就不能被协调),CoordinatorLayout就根据每个child所携带的Behavior信息进行协调。
  这里还需要提一句的是,Behavior不仅仅协助联动,而且还是接管了child的三大流程,有点类似于RecyclerViewLayoutManager
  而Behavior是怎么进行协助联动呢?这就涉及到嵌套滑动的相关知识,总的来说,Behavior包括整个CoordinatorLayout体系就是对嵌套滑动的应用和实现。所以,我们便知道了,嵌套滑动到底有多么重要了。
  本文主要介绍CoordinatorLayout的基本使用,主要是介绍CoordinatorLayoutAppBarLayout的搭配使用。

2. AppBarLayout

  如果我们想要实现折叠的ActionBar效果,在CoordinatorLayout中,AppBarLayout绝对是作为首选的控件。
  在正式介绍AppBarLayout的使用时,我们先来看看几个Flag,这几个Flag在AppBarLayout里面非常的重要。

名称 作用
SCROLL_FLAG_NO_SCROLL 0x0 设置这个flag,将表示该View不能被滑动。也就是说不参与联动。
SCROLL_FLAG_SCROLL 0x01 设置这个Flag,表示该View参与联动。具体效果需要跟其他Flag组合。
SCROLL_FLAG_EXIT_UNTIL_COLLAPSED 0x02 设置这个Flag,表示当View被推出屏幕时,会跟着滑动,直到折叠到View的最小高度;同时只有在其他View(比如说RecyclerView)滑动到顶部才会展开。
SCROLL_FLAG_ENTER_ALWAYS 0x02 设置这个Flag,不管是View是滑出屏幕还是滑进屏幕,该View都能立即响应滑动事件,跟随滑动。比如说,如果该View是折叠的,当RecyclerView向下滑动时,该View随时都能跟随展开;反之亦然。
SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED 0x04 SCROLL_FLAG_ENTER_ALWAYS的基础上,该Flag增加了折叠到固定高度的限制。在View下拉过程中,首先会将该View显示minHeight的高度,RecyclerView在继续下拉(这里以RecyclerView为例)。注意,该Flag在SCROLL_FLAG_ENTER_ALWAYS前提下生效。
SCROLL_FLAG_SNAP 0x08 该Flag表示View拥有吸附功能。比如说,当前滑动停止,View离底部更近,那么就会折叠;反之则会展开。

  这几个Flag非常的简单,我们来看看具体的使用,先来看看布局文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.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">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <View
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#5FF"
            app:layout_scrollFlags="scroll|enterAlwaysCollapsed" />
        <View
            android:background="#FF00FF"
            android:layout_width="match_parent"
            android:layout_height="50dp"/>
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

  这里需要几点,如下:

  1. 我在AppBarLayout里面放了两个View,其中一个设置scrollFlags,一个没有设置。没有设置的是不会折叠的。
  2. 在这里,AppBarLayout并没有设置Behavior,而RecyclerView却设置了的。我统一的解释一下,在CoordinatorLayout内部,理论上每个View必须携带一个Behavior,而这里AppBarLayout没有携带是因为它本身就有,所以不需要申明(在后面,我们会看到几种设置Behavior的方式,这里买一个关子。)

  然后,我们来看看效果:


  这里,我不再介绍其他Flag的效果,有兴趣可以尝试一下。

3. CollapsingToolbarLayout

  接下来,我们再来看一下CollapsingToolbarLayoutCollapsingToolbarLayout主要是实现折叠布局的,我们来看看是怎么使用的。首先,我们来看看CollapsingToolbarLayout的几个Flag:

名称 作用
COLLAPSE_MODE_OFF 0 默认值,表示View不会有任何属性
COLLAPSE_MODE_PIN 1 CollapsingToolbarLayout完全收缩之后,设置该Flag的View会保留在屏幕当中。
COLLAPSE_MODE_PARALLAX 2 设置该Flag的View会跟内容滚动,可以通过setParallaxMultiplier方法来设置视图差比率,其中0表示毫无视图差,完全跟内容滚动同步;1表示View完全不动。默认的视图差为0.5。

  接下来我们看一个Demo:

<androidx.coordinatorlayout.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">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="300dp">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                android:src="@drawable/demo"
                app:layout_collapseMode="parallax" />

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:background="#5FF"
                app:layout_collapseMode="pin" />
        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

  使用CollapsingToolbarLayout时,我们需要注意的是:CollapsingToolbarLayout需要作为AppBarLayout子View。然后我们来看看相关的效果:

4. 总结

  本文主要介绍CoordinatorLayout的基本使用,还是非常简单的,但是我们从上面的代码看出,好像根本就没有介绍它。CoordinatorLayout作为协调者,肯定是非常重要的,具体介绍在后续的文章会详细的分析。在这里先对本文做一个简单的总结。

  1. 使用AppBarLayout时,我们需要注意4种flag的不同点。
  2. CollapsingToolbarLayout需要作为AppBarLayout的子View才会有效,同时还需要注意它的3种flag。

  如果不出意外的话,下一篇文章我们将分析RecyclerViewAppBarLayout的联动。

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

推荐阅读更多精彩内容