Android CoordinatorLayout的简介与使用
参考文章:
CoordinatorLayout 学习(一) - CoordinatorLayout的基本使用
CoordinatorLayout使用详解: 打造折叠悬浮效果
一、概述
CoordinatorLayout
顾名思义,协调者布局,它遵循Material
风格,包含在 support Library
中。这里所谓的协调主要是只协调其子布局(child
)之间的联动,就那简书App
为例,当我们下拉文章的时候,上面的ActionBar
会自动隐藏,而这里就是上面所说的联动。下面将会通过一个简单的例子来实现类似的效果,当然简书实际是怎么实现的我是不知道的 = =,这里只是举个例子。
那么CoordinatorLayout
是如何实现child
联动的呢,答案是Behavier
。在CoordinatorLayout
内部,每个child
都必须带一个Behavior
(其实不携带也行,不携带就不能被协调),CoordinatorLayout
就根据每个child
所携带的Behavior
信息进行协调。
这里还需要提一句的是,Behavior
不仅仅协助联动,而且还接管了child
的三大流程,有点类似于RecyclerView
的LayoutManager
。
二、AppBarLayout
AppBarLayout
继承于LinearLayou
t的,默认的方向 是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 为例)。注意,该Flag 在SCROLL_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
是可以使用|
来拼接的。
三,使用
首先需要在app
的build.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
了,如果不设置这个属性那么RecyclerView
和AppBarLayout
是不会联动的。关于Behavior
后面我会单独写一篇文章进行介绍。
由于RecyclerView
中只需要填充一下数据即可,所以这里就不附上代码了,下面直接根据不同的flag
附上相应的效果图:
-
SCROLL_FLAG_NO_SCROLL
不设置layout_scrollFlags
即可:省略... <TextView android:layout_width="match_parent" android:layout_height="50dp" android:background="#FF0000" android:gravity="center" android:text="no_scroll" android:textSize="16sp"/> 省略...
效果图:
noscroll.gif
-
SCROLL_FLAG_EXIT_UNTIL_COLLAPSED
设置layout_scrollFlags
为exitUntilCollapsed
:省略... <TextView android:layout_width="match_parent" android:layout_height="50dp" android:background="#FF0000" android:gravity="center" android:text="exitUntilCollapsed" app:layout_scrollFlags="scroll|exitUntilCollapsed" android:textSize="16sp"/> 省略...
效果图:
exitUntilCollapsed.gif
-
SCROLL_FLAG_ENTER_ALWAYS
设置layout_scrollFlags
为enterAlways
——立即响应滑动事件:省略... <TextView android:layout_width="match_parent" android:layout_height="50dp" android:background="#FF0000" android:gravity="center" android:text="enterAlways" app:layout_scrollFlags="scroll|enterAlways" android:textSize="16sp"/> 省略...
效果图:
enterAlaways.gif
SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED
设置layout_scrollFlags
为scroll|enterAlways|enterAlwaysCollapsed
——立即响应滑动事件且先显示最小高度。注意需要同时设置enterAlways
和enterAlwaysCollapsed
两个标记位才能实现效果:
省略...
<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
SCROLL_FLAG_SNAP
设置layout_scrollFlags
为snap
——吸附效果:
省略...
<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
四、总结
-
AppBarLayout
必须作为CoordinatorLayout
的直接子View
,否则它的大部分功能将不会生效。 - 与
AppBarLayout
联动的View
需要设置layout_behavior
属性。 - 想要实现联动效果,其实只有
exitUntilCollapsed
、enterAlways
、enterAlwaysCollapsed
和snap
四种效果,且都需要与scroll
配合使用才会生效。 -
enterAlwaysCollapsed
还需要和enterAlways
同时使用才会生效,否则只会有exitUntilCollapsed
的效果。