以 skill 自身的术语
这是一款用于 React Native 与 Expo 动效构建的 skill。它能把一个动画需求转化为经得起真机评审的实现,并按照决定其是否「感觉对」的顺序来做出各项决策:是否应该动起来、运行在哪个线程上、作用于哪些属性、用 spring 还是 timing、手势如何交接、如何降级。
一切都源自三个移动端事实:没有 hover,存在两套运行时,并且用户的手指就在元素上。这适用于任何为 Expo 应用添加动画、手势、sheet、屏幕转场、按压反馈或 haptics 的场景,也适用于修复在设备上出现卡顿的动效。代码基于 Reanimated、Gesture Handler、Expo Router 和 expo-haptics 编写。
它产出什么
- 直接编写的实现代码本身,而不是作为可选方案提供。
- 一份简短的 gate 结果,说明频率层级和具名用途,并列出哪些被拒绝及原因。
- 要素行:工具、属性、弹簧或曲线加时长,以及工作在哪个运行时上执行。
- 设备上需要凭手感检查的一份清单,因为手势交接和触感反馈的时机无法从代码中读出。
工作方式
- 01先给动画设一道闸,别急着做别的
频率表决定动效是否会发生;最高档直接停止,不写任何代码。切换标签页从不使用滑动,因为标签是同级关系,而非层级关系。
- 02用一个词说明目的
该 skill 要求在继续之前先明确一个单词的意图——反馈、空间一致性、状态提示、避免突兀的变化、解释,或惊喜感(惊喜感仅用于罕见的首次体验时刻)。
- 03选择能用的、最便宜的工具
逐行检查表格,在第一个匹配的行停下:CSS transition、CSS keyframes、layout animation、shared value 加 Gesture,然后是 native stack、formSheet、NativeTabs、Link.Menu、RefreshControl、Lottie 或 Skia。
- 04限制可动画的属性
Transform 和 opacity 几乎不消耗性能;其他属性都会触发布局计算,每一帧都要在该节点及其兄弟节点上重新运行 Yoga。
- 05从 Finger 中选择 Spring 或 Timing
任何由手指驱动的交互都会带有一个 spring,让速度能够贯穿中断过程;其他所有交互则使用 timing curve,绝不使用 ease-in。
- 06让 Frame 远离 JS 线程
共享值会驱动 useAnimatedStyle,而不是 React 状态,RN-runtime 调用会被推迟到 onEnd 或阈值触发的反应中,而不是在手势更新内部直接触发。