Android收藏集Android安卓文档

Android CoordinatorLayout的简介与使用

2019-06-28  本文已影响27人  12313凯皇

参考文章
CoordinatorLayout 学习(一) - CoordinatorLayout的基本使用
CoordinatorLayout使用详解: 打造折叠悬浮效果

一、概述

CoordinatorLayout顾名思义,协调者布局,它遵循Material风格,包含在 support Library中。这里所谓的协调主要是只协调其子布局(child)之间的联动,就那简书App为例,当我们下拉文章的时候,上面的ActionBar会自动隐藏,而这里就是上面所说的联动。下面将会通过一个简单的例子来实现类似的效果,当然简书实际是怎么实现的我是不知道的 = =,这里只是举个例子。

那么CoordinatorLayout是如何实现child联动的呢,答案是Behavier。在CoordinatorLayout内部,每个child都必须带一个Behavior(其实不携带也行,不携带就不能被协调),CoordinatorLayout就根据每个child所携带的Behavior信息进行协调。
  这里还需要提一句的是,Behavior不仅仅协助联动,而且还接管了child的三大流程,有点类似于RecyclerViewLayoutManager

二、AppBarLayout

AppBarLayout继承于LinearLayout的,默认的方向 是Vertical.如果我们想要实现折叠的ActionBar效果,在CoordinatorLayout中,AppBarLayout绝对是作为首选的控件。
下面先来看一下AppBarLayout的滑动flag

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

注意:上面的这些flag是设置在其子view上的,例如下面的TextView

<android.support.design.widget.AppBarLayout
        android:id="@+id/bar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#FF0000"
            android:gravity="center"
            android:text="Title1"
            android:textSize="16sp"
            app:layout_scrollFlags="scroll|enterAlwaysCollapsed" />

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

AppBarLayout必须作为CoordinatorLayout的直接子View,否则它的大部分功能将不会生效,如layout_scrollFlags等。
另外,这个flag是可以使用|来拼接的。

三,使用

首先需要在appbuild.gradle中添加如下依赖:

implementation 'com.android.support:design:28.0.0'

然后是布局文件:

<?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.support.design.widget.AppBarLayout
        android:id="@+id/bar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#FF0000"
            android:gravity="center"
            android:text="Title1"
            android:textSize="16sp"
            app:layout_scrollFlags="enterAlways|exitUntilCollapsed|snap|scroll|enterAlwaysCollapsed" />

        <TextView
            
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#00FF00"
            android:gravity="center"
            android:text="Title2"
            android:textSize="16sp" />

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

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

注意这里RecyclerView设置了一个属性:app:layout_behavior="@string/appbar_scrolling_view_behavior",也就是前面所说的Behavior了,如果不设置这个属性那么RecyclerViewAppBarLayout是不会联动的。关于Behavior后面我会单独写一篇文章进行介绍。
由于RecyclerView中只需要填充一下数据即可,所以这里就不附上代码了,下面直接根据不同的flag附上相应的效果图:

设置layout_scrollFlagsscroll|enterAlways|enterAlwaysCollapsed——立即响应滑动事件且先显示最小高度。注意需要同时设置enterAlwaysenterAlwaysCollapsed两个标记位才能实现效果:

省略...
<TextView
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:minHeight="20dp"
    android:background="#FF0000"
    android:gravity="center"
    android:text="enterAlwaysCollapsed"
    app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
    android:textSize="16sp"/>
省略...

效果图:


enterAlwaysCollapsed.gif

设置layout_scrollFlagssnap——吸附效果:

省略...
<TextView
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:minHeight="20dp"
    android:background="#FF0000"
    android:gravity="center"
    android:text="snap"
    app:layout_scrollFlags="scroll|snap"
    android:textSize="16sp"/>
省略...

效果图:


snap.gif

四、总结

  1. AppBarLayout必须作为CoordinatorLayout的直接子View,否则它的大部分功能将不会生效。
  2. AppBarLayout联动的View需要设置layout_behavior属性
  3. 想要实现联动效果,其实只有exitUntilCollapsedenterAlwaysenterAlwaysCollapsedsnap四种效果,且都需要与scroll配合使用才会生效。
  4. enterAlwaysCollapsed还需要和enterAlways同时使用才会生效,否则只会有exitUntilCollapsed的效果。
上一篇下一篇

猜你喜欢

热点阅读