CoordinatorLayout
通常作为一个或多个子视图进行交互的布局容器,它的继承关系为:
简单翻译就是协调员布局,主要作为与一个或多个子视图进行特定交互的容器,和 AppBarLayout 搭配使用效果极佳。
AppBarLayout
是一个垂直的线性布局,它实现了 Material Designs 的许多特性 AppBar 概念,即滚动手势。AppBarLayout 的子view 应该通过设置 setScrollFlags(int) 或 app:layout_scrollFlags达到所需的滚动行为,它的继承关系为:
可以看到AppBarLayout 本质上是一个线性布局,而且是一个垂直方向上的线性布局。AppBarLayout 对象默认配置了一个 Behavior。而正是这个 Behavior ,它会响应外边的嵌套互动事件,然后根据特定的规则去展现和变换内部的子 View。
<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">
// app:layout_behavior 这个属性比较重要
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<!-- Your scrolling content -->
</androidx.core.widget.NestedScrollView>
<com.google.android.material.appbar.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent">
// 下面这个两个view 可以任意的,可以将需要联动的布局放在此处
// 也可以使用系统的 CollapsingToolbarLayout 和 Toolbar 来达到比较好用的效果
<androidx.appcompat.widget.Toolbar
...
app:layout_scrollFlags="scroll|enterAlways"/>
<com.google.android.material.tabs.TabLayout
...
app:layout_scrollFlags="scroll|enterAlways"/>
</com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
上述布局中 NestedScrollView 的属性 app:layout_behavior
比较重要,它要和 AppBarLayout 进行绑定,所以它必须指定 Behavior ,这个可以使用系统默认的 @string/appbar_scrolling_view_behavior
,如果有特殊需求也可以自定义 CoordinatorLayout.Behavior
。这里的 NestedScrollView 可以替换为 NestedScrollingChild 对象的所有子 View。如图:
可以看到我们经常用的 RecyclerView 都是 NestedScrollingView 的子View。
ApBarLayout 本身就是一个垂直方向的 LinearLayout,所以它的滑动主要是针对内部子 View 的滑动。滑动的时候需要定制一个规则。这个规则就是 AppBarLayout 中的内部的子 View 中,在 xml 中用 layout_scrollFlags,layout_scrollFlags的取值有7个:
在 Android 的发展历程中,出现了 TitleBar、ActionBar、Toolbar的进化。随后在Material Design 设计中又出现了 AppBar的概念,而 AppBarLayout 则是 AppBar 在 Android 中的代码实现。AppBarLayout 虽然和 ToolBar 没有直接联系,但是当 ToolBar 内置在 AppBarLayout 中的时候,ToolBar 的效果增强了,这使的 AppBarLayout 和 ToolBar 结合使用就非常酷炫的效果。
CollapsingToolbarLayout 出现的主要目的就是为了增强 ToolBar
CollapsingToolbarLayout 是用于 Toolbar 实现折叠应用程序栏的包装器。它旨在用作 AppBarLayout 的子 View。
CollapsingToolbarLayout 包括以下功能:
下面就逐个进行结束这些功能。
需要注意的是,当 CollapsingToolbarLayout 和 Toolbar 同时设定时,Collapsing Title中的 title 会覆盖 Toolbar 中的 title。Collapsing title 有展开 和 折叠 折两种状态。
大部分代码和 4.1 中的一样,只是在 CollapsingToolbarLayout 中设置了 contentScrim 属性,主要代码
在本例子中,内容纱布的主要效果是,当滑动覆盖或显示 AppBarLayout 内部的 view 时,会出现一层覆盖在 Toolbar 下方的 ImageView 上方的一层设置 contentScrim 颜色的纱布。就是在过渡的时候有一个渐变的过程。如果 AppBarLayout 只有 Toolbar ,则没有效果。
效果没有出来,等有空再研究下
CollapsingToolbarLayout 可以控制的子 View 滚动模式有3种:
parallax:这些属性可以通过 app:layout_collapseMode 来进行设置。对子 View 进行控制,视觉差就是 CollapsingToolbarLayout 中有两个子 View ,其中一个 View 设置此属性时,就造成此两个 View 在滚动的时候一个快一个慢,视觉差默认因子 DEFAULT_PARALLAX_MULTIPLIER为0.5,所以设置了 app:layout_collapseMode 的 View 比没有设置改属性的要慢。
pin: CollapsingToolbarLayout 中某个子 View 固定,无论是否存在滚动事件,只要设置 app:layout_collapseMode=”pin” 就可以了
AppBarLayout 定义的监听器为:
onOffsetChanged(appBarLayout: AppBarLayout?, verticalOffset: Int)
第一参数是 AppBarLayout ,第二个参数 verticalOffset 是 AppBarLayout 没有完全展开时滑动的距离,初始值为0,其他的时候值为负值,它绝对值的最大值为 AppBarLayout 的 totalScrollRange。可以用如下监听位移方式做一些处理:
appBarLayout.addOnOffsetChangedListener(object : AppBarLayout.OnOffsetChangedListener {
override fun onOffsetChanged(appBarLayout: AppBarLayout?, verticalOffset: Int) {
Log.d(TAG, "verticalOffset:$verticalOffset")
if (abs(verticalOffset) == appBarLayout?.totalScrollRange) {
Log.d(TAG, "折叠")
} else {
Log.d(TAG, "展开")
}
}
})
大概用法就是这些,还有部分内容需要补充。