【Android】Material Toolbar
通过 CoordinateLayout
+ AppBarLayout
+ CollapsingToolbarLayout
组装成一个符合 Material 动画表现的复合 Toolbar。
结构
<CoordinatorLayout> // 提供子类相互关联同步运动功能
<AppBarLayout> // 组装一个合成的 App bar,并提供基本的同步滚动功能实现
<CollapsingToolbarLayout> // 提供 Toolbar 专用的 Material 折叠、形变动画
<Background View />
<Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" />
</CollapsingToolbarLayout>
<Other part belong to app bar /> // 同步滚动功能对其他�子View 无效
</AppBarLayout>
<NestedScrollingChild /> // 提供滚动参考数据
...
</CoordinatorLayout>
CoordinatorLayout
提供 View 之间的基础联动交互功能
布局方式与 FrameLayout 相同,可协调(关联)内部任意某些 子View(指定app:layout_behavior
属性,aka "ChildView")跟随另一个任意特定 View(aka "DependencyView")的尺寸、位置变化或被移除、手势交互等动作时,做相对变化响应(需要自定义Behavior处理器
并设置到上面的属性中)。
关于 anchor
子View 可指定任意另一个 CoordinatorLayout 内的子View作为其锚定(anchor)的对象,用于布置浮动跟随型的View,此时 子View 将跟随其 anchor 指定的 anchoredView 移动。
子View 不能锚定自己本身,也不能锚定其 子View(会形成环形依赖)。
属性
Constructor部分,用于本体
-
statusBarBackground
:状态栏背景 Drawable
LayoutParams部分,用于子元素
-
layout_behavior
:用于 ChildView 上,指定当前 View 相对于其他 View 的相对动作响应处理器 -
layout_anchor
:指定一个锚定对象View -
layout_anchorGravity
:指定锚定跟随位置,默认为目标对象的左上角 -
layout_insetEdge
:该子View 从哪个方向插入 CoordinatorLayout 容器 -
layout_dodgeInsetEdges
:该子View 回避下一个同方向插入的 View 的移动方向
Behavior
用于指定当前View(Child)相对于其他View(Dependency)作出自定义响应的逻辑脚本监听响应类
AppBarLayout
提供基础关联滚动实现
LinearLayout 子类容器,用于垂直串联组装一个逻辑上的 AppBar(不限定使用 Toolbar),内部指定了默认Behavior
实现,可让(第一个)子View(通过app:layout_scrollFlags
属性值指定)跟随外部的 ScrollableView(NestedScrollingChild子类)滚动动作而做特定滚动动作。
通常需要在 NestedScrollingChild(或其父容器)上指定app:layout_behavior="@string/appbar_scrolling_view_behavior"
,使该 View 在 CoordinatorLayout 中正确布局在 AppBarLayout 下方,并随 AppBarLayout 滚动做相对位移。
属性
Constructor部分,用于本体(仅在 CoordinatorLayout 内生效)
-
expanded
:初始化时是否以扩展形式展示
LayoutParams部分,仅用于第一个子元素
-
layout_scrollFlags
:指定联动滚动的表现方式- scroll:作为头部,与目标 View 的 scroll 动作同步滚动,该值作为下面其他属性的前提条件联合使用,如
app:layout_scrollFlags="scroll|...
- enterAlways:scroll 下滑动作发生时,立即触发 AppBar 下滑弹出
- enterAlwaysCollapsed:与
enterAlways
配套,AppBar 仅弹出一个最小高度,直至 scroll 下滑至顶端时,再继续下滑弹出完整的 AppBar - exitUntilCollapsed:scroll 上滑动作发生时,AppBar 仅上滑收缩至一个最小高度(普通 Toolbar 高度),不完全隐藏
- snap:AppBar 作为一个整体完整出现或隐藏,并提供弹性动画效果
- scroll:作为头部,与目标 View 的 scroll 动作同步滚动,该值作为下面其他属性的前提条件联合使用,如
-
layout_scrollInterpolator
:指定动画曲线插值器
CollapsingToolbarLayout
提供 Material 式的关联滚动动画实现(依赖 AppBarLayout)
FrameLayout 子类,用于包裹(层叠) Toolbar 及其 背景View 等部件,(通过指定各种app:
属性值)提供符合 Material Design 规范的 Toolbar 及其背景的折叠拉伸、遮罩、视差动画等视觉效果。
需要放置在 AppBarLayout
下作为直接子View使用(可复数并列使用)。
使用方式可参考 玩转AppBarLayout。
属性
Constructor部分,用于本体
-
collapsedTitleGravity
、expandedTitleGravity
:缩放后 Title 的对齐方式- center、center_vertical、center_horizontal
- start、end
- top、bottom、left、right
- fill_vertical
-
expandedTitleMargin
、expandedTitleMarginStart
、expandedTitleMarginEnd
、expandedTitleMarginTop
、expandedTitleMarginBottom
:Title 扩展后所需的四边 margin -
collapsedTitleTextAppearance
、expandedTitleTextAppearance
:缩放后 Title 的 style 形式(颜色和大小) -
contentScrim
:内容遮罩,Toolbar 折叠完毕后覆盖原背景图的新背景颜色 -
statusBarScrim
:状态栏背景遮罩,要求 API 21 并设置 fitsSystemWindows -
scrimVisibleHeightTrigger
:触发遮罩效果的最小可视高度(带单位) -
scrimAnimationDuration
:遮罩动画时长 -
titleEnabled
:是否启用动态缩放 Title -
title
:Toolbar 折叠后显示的标题文字,会根据折叠程度缩放大小 -
toolbarId
:指定应用动画效果的 Toolbar 组件id,不指定则以第一个搜索到的 Toolbar 为准
另外可通过代码独立指定 Title 的颜色、字体、遮罩图像、遮罩及其动画开闭等效果。
LayoutParams部分,用于直接子元素
-
layout_collapseMode
Bar发生联动滚动折叠时,子View的动作模式- none:不折叠
- pin:折叠模式下 Toolbar 保留在顶部位置
- parallax:视差跟随滚动
-
layout_collapseParallaxMultiplier
视差浮点系数,控制视差滚动的偏移量,负数表示加速滚动,0 表示完全跟随滚动(没有视差效果),1f 表示完全逆向滚动(相对静止状态),>1f 表示逆向加速滚动,默认值为0.5,源码视差偏移算法简约为offset = Math.round(-verticalOffset * parallaxMult)
,其中verticalOffset
表示 scroll 的垂直滚动量