Constraint Layout 是最受欢迎的 Jetpack 库之一,Constraint Layout 2.0 正式版现已发布(目前较新的版本为 2.1.0-alpha1)!如果您已经熟悉 Constraint Layout 1.1 的常用能力,并开始借助它快速搭建复杂的 Android 页面布局,那么 2.0 不仅完整保留了 1.1 的功能,还在 Android Studio 中集成了可直接预览 XML 布局的工具,甚至支持在预览界面中直接编辑布局。
Constraint Layout 2.0 为 Android 开发布局设计带来了许多新特性,您只需要在 build.gradle 中更新依赖版本即可完成升级使用。
implementation “androidx.constraintlayout:constraintlayout:2.0.1”随着 2.0 版本发布,我们也专门在 github 上创建了 Constraint Layout 的代码库。不过目前该代码库仍处于只读状态,后续会逐步开放 pull request 权限。
Flow
Flow 是一种全新的虚拟布局,主要用于构建链式排版效果。当可用空间不足时,它可以自动换行,甚至自动延展到屏幕的其他区域。如果您需要对多个元素进行链式布局,但又无法提前确定运行时的实际布局空间大小,那么 Flow 会非常实用。通过 Flow,布局可以随着应用屏幕尺寸变化而自动适配,例如设备旋转后产生的宽度变化场景。
图片 : 该动画展示了 Flow 如何创建多条链,并让布局元素更充分地填满整行空间
Flow 本质上是一种虚拟布局。在 Constraint Layout 中,虚拟布局(Virtual layouts)承担着 virtual view group 的角色,能够参与约束与布局计算,但不会作为真实视图加入到视图层级结构中。它们只是通过引用其他视图,来辅助这些视图完成各自的布局逻辑。
图片 : flow 三种模式 "none"、"chain" 和 "align" 的可视化展示效果
在 Constraint Layout 2.0 中,您可以通过 Flow 标签使用这一能力。Flow 会根据传入的 constraint_referenced_ids 参数获取需要引用的全部视图,然后创建一个虚拟的 virtual view group,并基于这些视图生成链式布局效果。
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:flow_wrapMode="chain"
app:constraint_referenced_ids="card1, card2, card3"
/>这是在 Constraint Layout 中使用 Flow 的典型示例。
Flow 中最关键的配置项之一是 wrapMode,它决定了内容溢出或发生换行时的布局表现。
您可以为 wrapMode 指定以下三种模式:
- none – 所有被引用的视图会以单条链的形式进行布局,如果内容溢出,则超出部分不可见;
- chain – 当发生溢出时,超出的内容会自动换行,并以新的一条链继续布局;
- align – 与 chain 类似,但它不是按行排列,而是按列方式进行布局。
如果您想进一步了解 Flow 的详细用法,请查阅官方文档。
Layer
Layer 作为一项新的辅助能力,可以让您在多个视图之上创建一个虚拟图层(layer)。与 Flow 不同,Layer 不负责视图布局,而是用于同时对多个视图执行变换(transformation)操作。
如果您希望将多个视图作为一个整体进行旋转(rotate)、平移(translate)或缩放(scale)处理,那么 Layer 会是非常合适的选择。
图片 : 使用 Layer 同时对多个视图执行变换操作
图层(layer)会在布局期间自动调整大小,其尺寸会根据它所引用的全部视图范围动态计算。
您可以在 Constraint Layout 2.0 中通过 Layer 标签添加一个图层(layer)。
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:constraint_referenced_ids="card1, card2, card3"
/>以上是在 Constraint Layout 中使用 Layer 的示例。
Motion Layout
动画 : 集成 Motion Layout 示例运行后的界面截图
Motion Layout 可以说是 Constraint Layout 2.0 中最受关注的核心功能之一。它为开发者提供了一套功能强大的 Android 动画系统,能够协调多个视图之间的联动动画效果。MotionLayout 基于 ConstraintLayout 扩展而来,支持在多组约束(也就是 ConstraintSets)之间执行动画过渡。您可以自由定义视图的移动、滚动、缩放、旋转、淡入淡出等动画行为,甚至还能为动画添加自定义属性。除此之外,它还能够处理手势驱动下产生的物理移动效果,并支持控制动画速度。值得一提的是,使用 MotionLayout 构建的动画具备可追溯、可逆的特性,也就是说,您可以轻松切换到动画过程中的任意时间点,甚至反向播放动画。
Android Studio 已集成 Motion Editor(动作编辑器),可用来对 MotionLayout 动画进行生成、预览与编辑。借助这一工具,在处理多视图联动动画时,开发者可以更高效地完成细节调整与可视化控制。
您可以通过阅读 Scott Swarthout 的文章《Android Studio 中的 Motion Editor 用法详解》,进一步了解 Motion Editor 的相关内容。
如果您想通过教程一步步学习 Motion Layout,可以查看这个 codelab:
- 使用 Kotlin 开发 Android 应用的进阶教程 03.2: 使用 MotionLayout 生成动画效果
Motion Layout 是一个通用型动画工具,几乎可以用于构建 Android 平台上的各种动画效果。尤其在以下两类场景中,MotionLayout 相比其他动画方案优势更明显:
- 可追溯的动画 - 由其他输入驱动的动画,例如工具栏在页面滚动时产生的折叠效果
- 状态转换 - 由状态变化驱动的动画,例如用户进入某个界面后,随着页面状态切换而展示出的不同动画效果
新的集成 Motion Layout 示例展示了如何在不同场景下使用 Motion Layout 构建动画效果。每个界面都旨在帮助您理解:在特定业务场景中,如何利用 Motion Layout 实现实用的交互动效,以及如何把这些效果整合到其他视图组件之中。
Constraint Layout 2.0 还包含许多值得关注的新功能。您可以结合官方文档、codelab 以及代码示例,在自己的 Android 应用中逐步实践和使用它。
期待看到您使用 Constraint Layout 2.0 构建出更优秀的应用!
