Tokens
曲线、时长与效果形成统一调用语言。
系统设计 · 从0-1搭建
从动效语言、Token到18类OS控件,建立一致且可研发调用的交互规范
系统设计 · 从0-1搭建
从动效语言、Token到18类OS控件,建立一致且可研发调用的交互规范
系统内已有大量动效需求,但缺少可复用的语言和调用方式。同类反馈容易出现不同节奏,设计意图也难以被研发准确复现。
我的目标不是增加更多动画,而是定义一套团队共同理解的判断标准。
用稳定的底层变量支撑组合方式,再通过控件规范进入实际产品。
曲线、时长与效果形成统一调用语言。
Alpha、Scale、Size、Rotate、Colour、Position 六类原子属性,组合出完整状态变化。
为交互事件、状态切换与显隐建立参数规则。
曲线定义运动性格,时长跟随范围、出入场方向与复杂度变化。
以 60ms 为递增单位形成四组 Token。运动范围越大、元素越复杂,持续时间越长;同一元素的入场通常长于出场。
每段动画都需要解释它在沟通什么,避免为动而动。
建立元素出现、离开与层级变化的连续性。
帮助用户理解页面、面板与内容之间的空间关系。
即时回应按压、选择、完成和错误等操作结果。
解释等待状态,并把注意力带向下一步。
完整动效由基础属性组合而成。悬停每个示例可查看属性变化。
原子属性与 Token 组合后,形成可直接复用的过渡方式。
我把统一语言继续拆到按压反馈、状态切换、显隐和手势四组控件行为中。
每个控件按 Interaction Event、State Change、Element、Parameter、Token 的结构描述,研发可以直接映射实现,设计也能沿用同一判断逻辑继续扩展。
PICO OS Motion System
PICO OS从5.0向6.0迭代时,暴露出系统性的动效体验问题。作为核心负责人,我从0-1搭建了覆盖VR/Web/App多端的动效设计体系。
核心矛盾
"无规范、无组件、无框架"的三无状态,导致用户体验割裂、团队重复低效、业务转化受损。
📹 动效Demo展示区
此处将展示PICO OS的实际动效案例
(需要补充:界面录屏/动效GIF/设计稿)
没有可参考的前例,我通过三步建立起完整的动效设计体系:
定义5个核心原则,作为整个系统动效设计的基础框架和质量判断标准:
全系统使用统一的曲线和时长Token体系,确保跨页面、跨功能的动效体验一致,形成PICO品牌辨识度和流畅感知。
将动效属性做成可高效调取的Tokens,建立曲线Token、时长Token、效果Token三层体系,让设计师和开发轻松创建和管理动画。
用户操作后第一时间给出反馈,反馈状态统一化。交互过程中给予及时响应和积极反馈,明确操作状态。
不同设备采用不同时长:手机200-300ms、平板延长30%、可穿戴缩短30%、Web 150-200ms。VR/大屏避免大范围移动或旋转,防止眩晕。
2-9秒:循环加载动效,趣味化设计缓解焦虑;10秒以上:进度条形式,给明确时间预期;10秒后无效,给空页面状态。
Token体系不仅仅是参数的集合,更是一套"冲突消解机制"——通过分层、分类的预设,让不同场景的动效需求在统一框架内各得其所,而不是各自为政。
将动效曲线结构化为条件判断规则,让AI系统能够根据场景自动匹配合适的动效参数。
| Token名称 | 数学定义 | 触发条件(AI判断规则) | 典型场景 |
|---|---|---|---|
| Spring.gradual | damping=0, mass=1, stiffness=100 |
if (interactionType === "realtime" && emphasis === "low") |
Hover态轻微缩放 |
| Spring.steady | damping=0, mass=1, stiffness=170 |
if (interactionType === "realtime" && emphasis === "medium") |
按钮点击反馈 |
| Spring.rapid | damping=0, mass=1, stiffness=240 |
if (interactionType === "realtime" && emphasis === "high") |
快速切换tab |
| Spring.bouncy | damping=0.7, mass=1, stiffness=170 |
if (needsPlayfulness === true && userAge < 25) |
弹性反馈动效 |
| Bézier.standard | cubic-bezier(0.4, 0.0, 0.2, 1) |
if (transitionType === "pageNav" && speed === "normal") |
页面转场 |
| Bézier.decelerate | cubic-bezier(0.0, 0.0, 0.2, 1) |
if (direction === "enter" || animationType === "fadeIn") |
元素入场 |
| Bézier.accelerate | cubic-bezier(0.4, 0.0, 1, 1) |
if (direction === "exit" || animationType === "fadeOut") |
元素出场 |
AI系统应用示例
// AI系统根据场景自动选择Token
function selectMotionToken(context) {
if (context.interactionType === "realtime") {
return context.emphasis === "high" ? "Spring.rapid" : "Spring.steady";
}
if (context.transitionType === "pageNav") {
return context.direction === "enter" ? "Bézier.decelerate" : "Bézier.accelerate";
}
return "Bézier.standard"; // 默认
}
将动效时长参数化,让AI系统根据运动距离、设备类型、内容重要性自动计算最优时长。
| Token分档 | 基准值 | 触发条件(AI计算规则) | 设备系数 |
|---|---|---|---|
| Short 1-4 | 60-240ms | if (distance < 50px && type === "stateChange") |
Mobile: 1.0x / Tablet: 1.3x / Wearable: 0.7x / VR: 0.7x |
| Medium 1-4 | 300-480ms | if (distance >= 50px && distance < 200px) |
Mobile: 1.0x / Tablet: 1.3x / Web: 0.75x |
| Long 1-4 | 540-720ms | if (distance >= 200px || type === "pageTransition") |
Mobile: 1.0x / Tablet: 1.3x / VR: 0.7x |
| Extra-long 1-4 | 780-960ms | if (userTrigger === false && importance === "low") |
仅用于系统级非用户主动触发场景 |
AI自适应时长计算公式
// AI系统根据场景参数自动计算最优时长
function calculateDuration(distance, deviceType, isUserTriggered) {
// 基础时长映射
let baseDuration;
if (distance < 50) baseDuration = 150; // Short
else if (distance < 200) baseDuration = 390; // Medium
else baseDuration = 630; // Long
// 设备系数调整
const deviceMultiplier = {
mobile: 1.0,
tablet: 1.3,
wearable: 0.7,
vr: 0.7,
web: 0.75
};
// 用户主动触发的动效时长更短
const triggerMultiplier = isUserTriggered ? 1.0 : 1.2;
return baseDuration * deviceMultiplier[deviceType] * triggerMultiplier;
}
将Token体系转化为AI可理解的条件判断规则,不仅是技术实现的需要,更是设计系统化思维的体现:
将设计师脑中的经验判断显性化为if-else规则,让AI系统能够在无人监督的情况下做出正确的动效选择。
新增场景时无需重新设计,只需在现有Token体系中补充新的条件分支,保证系统的长期可维护性。
通过设备系数参数,让同一套规则自动适配Mobile/Tablet/VR/Web多端,而不是为每个端单独设计。
为AI驱动的界面生成、自动化设计提供底层支撑,让AI不仅能生成界面,还能生成符合品牌规范的动效。
通过条件优先级和参数组合,让看似矛盾的设计需求在同一框架内各得其所:
| 潜在冲突场景 | AI判断逻辑 | Token选择结果 |
|---|---|---|
| 同一按钮在不同设备上的点击反馈 | if (device === "vr") return Spring.rapid * 0.7;else return Spring.steady * 1.0; |
VR设备时长缩短30%,防止晕眩 |
| 页面入场 vs 页面出场的节奏差异 | direction === "enter" ? Bézier.decelerate : Bézier.accelerate;exitDuration = enterDuration * 0.5; |
入场减速曲线+长时长,出场加速曲线+短时长 |
| 强调性动效 vs 普通动效 | if (emphasis === "high") return Spring.rapid;else return Spring.gradual; |
根据内容重要性动态调整曲线刚度 |
| 用户触发 vs 系统触发的时长差异 | baseDuration * (isUserTriggered ? 1.0 : 1.2); |
系统触发的动效时长增加20%,降低突兀感 |
| 实时交互 vs 页面转场的曲线选择 | interactionType === "realtime" ? Spring : Bézier; |
手势跟随用Spring,页面切换用Bézier |
设计系统化思维的体现
好的Token体系不是"一个参数对应一个值",而是"一套规则对应一类场景"。通过条件判断、参数组合、优先级定义,让AI系统能够像设计师一样思考:这个场景应该用什么动效?为什么?
以PICO OS的应用启动场景为例,展示AI系统如何根据Token体系自动生成符合规范的动效方案。
用户在VR头显中点击应用图标,系统需要完成:图标反馈 → 应用卡片展开 → 内容淡入 → 系统UI收起。
{
"action": "appLaunch",
"device": "vr",
"userTriggered": true,
"steps": [
{
"element": "appIcon",
"animationType": "stateChange",
"distance": 8,
"emphasis": "medium"
},
{
"element": "appCard",
"animationType": "expand",
"distance": 450,
"emphasis": "high"
},
{
"element": "appContent",
"animationType": "fadeIn",
"distance": 0,
"delay": true
},
{
"element": "systemUI",
"animationType": "fadeOut",
"distance": 0,
"userTriggered": false
}
]
}
// AI自动决策逻辑
function generateMotionPlan(scene) {
return scene.steps.map(step => {
// 规则1: 根据交互类型选择曲线族
const curveFamily = (step.animationType === "stateChange" ||
step.animationType === "expand")
? "Spring" : "Bézier";
// 规则2: 根据距离和设备计算时长
let baseDuration;
if (step.distance < 50) baseDuration = 150; // Short
else if (step.distance < 200) baseDuration = 390; // Medium
else baseDuration = 630; // Long
const duration = baseDuration * (scene.device === "vr" ? 0.7 : 1.0);
// 规则3: 根据强调程度选择具体Token
const curve = curveFamily === "Spring"
? (step.emphasis === "high" ? "Spring.rapid" : "Spring.steady")
: (step.animationType === "fadeIn" ? "Bézier.decelerate" : "Bézier.accelerate");
// 规则4: 系统触发的动效延长时长
const finalDuration = step.userTriggered === false
? duration * 1.2
: duration;
return {
element: step.element,
curve: curve,
duration: Math.round(finalDuration),
delay: step.delay ? finalDuration * 0.5 : 0
};
});
}
| 元素 | 动效类型 | 曲线Token | 时长 | 延迟 | 决策依据 |
|---|---|---|---|---|---|
| 应用图标 | stateChange | Spring.steady | 105ms | 0ms | 用户触发 + VR设备系数0.7 + 中强调 |
| 应用卡片 | expand | Spring.rapid | 441ms | 0ms | 大距离运动 + VR设备 + 高强调 |
| 应用内容 | fadeIn | Bézier.decelerate | 273ms | 220ms | 入场动效 + 延迟0.5倍卡片时长 |
| 系统UI | fadeOut | Bézier.accelerate | 126ms | 0ms | 出场动效 + 系统触发 + VR设备 |
AI系统决策的关键优势
一致性保证:同样的场景参数永远产生同样的动效方案,避免人工决策的随意性。
多端自适应:修改device参数后,所有时长自动按系数调整,无需重新设计。
规则可追溯:每个Token选择都有明确的决策依据,便于调试和优化。
可扩展性:新增场景只需补充条件分支,不破坏现有规则。
体系不仅服务于PICO OS,也被官网、App等业务线参考复用,成为PICO设计语言的重要组成部分。
关键成果
从"三无状态"到统一动效语言,Token体系让80%需求直接复用预设,20%特殊场景也有明确原则指导。
📄 设计规范文档展示区
此处将展示Motion Principle文档截图
(需要补充:文档界面/Token定义页面/应用案例)
没有前例可参考时,最大的挑战不是"怎么做",而是"做什么"。我通过三个维度的问题诊断(用户体验层、团队协作层、业务影响层),识别出核心矛盾不是缺少动效,而是缺少统一的设计语言。这让我明确了设计目标:不是做更多动效,而是建立一套能复用、能约束、能指导的规范体系。
Token体系不仅仅是参数的集合,更是一套"冲突消解机制"。通过分层、分类的预设,让不同场景的动效需求在统一框架内各得其所:
这种"预设大于定制"的策略,让80%的需求可以直接使用Token,只有20%的特殊场景需要定制。这不仅提高了效率,更重要的是保证了体验的一致性。
VR设备有独特的设计约束:大范围移动会导致晕眩、景深变化需要时间适应、空间交互与2D屏幕完全不同。我没有把这些约束当作"限制",而是转化为明确的设计原则:
这些原则被写入《动效设计指南》,成为所有VR动效设计的判断标准。
设计规范不是一次性的产出,而是持续的知识资产。《PICO OS Motion Principle》不仅服务于OS团队,也被官网、App等其他业务线参考和复用。更重要的是,它建立了一套"可传递的设计判断标准"——新同事不需要靠经验积累,可以直接通过文档理解"PICO的动效应该是什么样的"。