动效系统让界面(UI)表现更具表达力,同时更易于使用。
Material 在 M3 Expressive 中引入了动效系统,这套全新的“基于物理逻辑”的系统,让交互与过渡动画显得更加鲜活、顺滑、自然。它为 Google 产品带来了一套全新的动态语言,并且比以往任何时候都更容易实现与自定义。这套物理系统将取代此前“基于缓动(easing)与时长(duration)”的旧系统,可了解更多 M3 Expressive 的内容
基于物理的动效系统(Motion physics system)内置两种预设的动效方案:表达型(expressive)和标准型(standard)。你所选择的动效方案,会直接决定产品的整体体验气质。虽然产品中的大部分动效都应该保持同一种方案,但在关键时刻,你也可以通过切换动效方案来强化重点场景。
表达型(expressive)是 Material 主张性较强的一套动效方案,适用于绝大多数场景,尤其是“核心展示(hero moments)”与关键交互。
标准型(standard)动效方案更加功能化、克制,几乎不包含回弹,适合偏工具属性或强调效率的产品。
需要超出预设范围的动效方案?那就自定义一套吧!基于物理的动效系统让你能够轻松创建自定义动效方案(custom motion schemes),并仍然可与主题(theming)系统联动。你可以在表达型(expressive)、标准型(standard)或自定义方案(custom)之间自由切换,以适应不同场景。
动效方案(Motion schemes)由弹性动效(springs)来驱动。一个弹性动效由三项关键属性共同构成,它们决定所有动效的行为特征:
弹性动效模型具有高度通用性,同一套弹性动效参数可以同时用于多种场景,例如页面过渡、按钮动效、手势反馈等。这让整个产品的动效语言保持一致的节奏与气质。
弹性动效模型的动效更自然。弹性动效的行为具有可预测性,与现实世界物体的运动和回弹方式相似。它能无缝处理手势交互、中断恢复、目标重新定位(retargeting)等复杂动效场景。
在 Jetpack Compose(Jetpack Compose)和 MDC-Android(MDC-Android)中,这些弹性动效参数以弹性动效令牌(spring tokens)的形式提供。通过这些令牌,你可以轻松为任意界面元素应用动效,让跨平台的动效表现保持可预测、且一致。关于如何将弹性动效(spring)转换到 Web(Web)等其他平台,请参阅规范文档(specs)
弹性动效令牌分为两类:空间移动(spatial)与特效(effects);每类都有三种速度档位:默认(default)、快速(fast)与慢速(slow)。
例如,要应用“快速(fast)·空间(spatial)·表达型(expressive)”动效,你应先调用表达型动效方案(expressive motion scheme),再使用以下令牌:md.sys.motion.spring.fast.spatial。
注意:表达型(expressive)动效方案本身并不会写进令牌名称中。它是在产品层级被统一设定,并作用于所有令牌的。这样,你就可以不修改令牌本身的前提下,自由切换不同的动效方案。

空间类弹性动效令牌(spatial spring tokens)用于处理屏幕中“位置与形态变化”相关的动画,例如 X 轴与 Y 轴的移动、旋转、尺寸变化、圆角变化等。空间类弹性动效通常会出现“超调(overshoot)”和“回弹(bounce)”,最终落在目标位置。
特效类弹性动效令牌(effects spring tokens)用于处理诸如颜色(color)变化、透明度(opacity)变化等属性动画,并且这些动画不应出现超调(overshoot)。
空间类弹性动效令牌(spatial spring tokens)与特效类弹性动效令牌(effects spring tokens)共有三种速度(speed):默认(default)、快速(fast)与慢速(slow)。大多数动效应使用默认速度(default);较小的组件可使用快速(fast);较大范围或全屏动效可使用慢速(slow)。
| Speed(速度) | Spatial example(空间类示例) | Effects example(特效类示例) |
|---|---|---|
| Default(默认) | 部分覆盖屏幕的动画,例如底部抽屉(bottom sheet)或展开导航轨(expanded navigation rail) | 导航轨(navigation rail)内部内容的透明度(opacity)变化 |
| Fast(快速) | 小型组件,例如开关(switch)与按钮(button)的位移或变化 | 开关手柄(switch handle)的颜色(color)变化 |
| Slow(慢速) | 全屏动画(full-screen animations) | 全屏内容刷新(full-screen content refresh) |
弹性动效令牌(spring tokens)可在不同设备间保持一致性。例如,空间类的快速令牌(spatial fast token)一定比默认(default)或慢速(slow)更快,但每个令牌的具体参数值会因设备类型不同(如可穿戴设备 wearable、手机 phone、平板 tablet)而调整。这样可以确保在不同设备环境下,动效都能保持“合适的快感”与一致的体验感知。
在 Jetpack Compose(Jetpack Compose)中,有 21 个 Material 组件默认使用基于物理的动效系统(motion physics system)。MDC-Android(MDC-Android)即将提供支持。若要将基于物理的动效系统(motion physics system)应用到其他组件(包括自定义组件),请使用弹性动效令牌(spring tokens)。查看完整规范(full specs)
在应用动效(motion)时,可以选择不同的层级(levels)。请选择最适合你的产品(product)或特定组件(component)的动效层级。
表达型(expressive)与标准型(standard)两种动效方案一般已足够满足所有动效需求。在 Jetpack Compose(Jetpack Compose)中,组件默认采用这两种动效方案。
在 Jetpack Compose(Jetpack Compose)中,如果你希望更改所有组件(components)与过渡动画(transitions)所使用的默认动效方案(default motion scheme),你需要创建一个自定义的 MotionScheme(MotionScheme)对象,并为动效方案中的每个属性(property)返回相应的 AnimationSpec(AnimationSpec)。
既然可以使用多套动效方案(motion schemes),为什么只用一套呢?在 Jetpack Compose(Jetpack Compose)中,如果你的产品(product)大部分场景使用某一套动效方案,例如表达型(expressive)方案,但希望在某些特定元素(element)上替换为另一套方案,例如标准型(standard)方案,那么你可以通过覆写(override)该元素所属的 CompositionLocal(CompositionLocal),以在该 composable(composable)、页面(screen)或特定元素上切换动效方案。
基于物理的动效系统(motion physics system)已在 Jetpack Compose(Jetpack Compose)与 MDC-Android(MDC-Android)中提供支持,并且可以轻松适配到其他平台。
| Platform(平台) | Status(状态) | How to apply(使用方式) |
|---|---|---|
| Jetpack Compose(Jetpack Compose) | 可用(Available) | 使用内置组件(built-in components)与弹性动效令牌(spring tokens)。 |
| MDC-Android(MDC-Android) | 可用,但尚未加入组件(Available. Not yet added to components.) | 使用内置的弹性动效令牌(built-in spring tokens)。 |
| Web(Web) | 兼容(Compatible) | 在可能的情况下使用弹性动效(springs);若不可用,则使用模拟弹性行为的曲线(curves)来处理无中断或无手势需求的动画。参见 Web 转换表(web conversion table)。 |
弹性动效复合令牌(spring composite tokens)用于基于物理的动效系统(motion physics system)。这些复合令牌(composites)会将两种弹性动效令牌——阻尼(damping)与刚度(stiffness)——合并为一个令牌,方便使用。缓动(easing)、时长(duration)与路径(path)等令牌属于旧的动效系统(legacy system),因此可以忽略。
将弹性动效转换为曲线
| Spring(弹性动效) | Curve(曲线) |
|---|---|
| Expressive fast spatial(表达型·快速·空间) | 0.42, 1.67, 0.21, 0.90,时长(Duration)= 350ms |
| Expressive default spatial(表达型·默认·空间) | 0.38, 1.21, 0.22, 1.00,时长(Duration)= 500ms |
| Expressive slow spatial(表达型·慢速·空间) | 0.39, 1.29, 0.35, 0.98,时长(Duration)= 650ms |
| Expressive fast effects(表达型·快速·特效) | 0.31, 0.94, 0.34, 1.00,时长(Duration)= 150ms |
| Expressive default effects(表达型·默认·特效) | 0.34, 0.80, 0.34, 1.00,时长(Duration)= 200ms |
| Expressive slow effects(表达型·慢速·特效) | 0.34, 0.88, 0.34, 1.00,时长(Duration)= 300ms |
| Standard fast spatial(标准型·快速·空间) | 0.27, 1.06, 0.18, 1.00,时长(Duration)= 350ms |
| Standard default spatial(标准型·默认·空间) | 0.27, 1.06, 0.18, 1.00,时长(Duration)= 500ms |
| Standard slow spatial(标准型·慢速·空间) | 0.27, 1.06, 0.18, 1.00,时长(Duration)= 750ms |
| Standard fast effects(标准型·快速·特效) | 0.31, 0.94, 0.34, 1.00,时长(Duration)= 150ms |
| Standard default effects(标准型·默认·特效) | 0.34, 0.80, 0.34, 1.00,时长(Duration)= 200ms |
| Standard slow effects(标准型·慢速·特效) | 0.34, 0.88, 0.34, 1.00,时长(Duration)= 300ms |
原先的缓动令牌(easing tokens)与时长令牌(duration tokens)依然可作为回退方案使用,并且目前仍用于过渡动画(transitions)的动效设置。查看缓动与时长系统(easing and duration system)
有0人收藏了本文