SuperAPI AI 工具集

expo-animation

前端与建站

查看项目

更新于 10-19 01:56

技能介绍

用途

该技能用于在 Expo / React Native 项目中构建移动端动画。当用户提出“加个动效”“让这个交互更顺滑”“实现拖拽关闭面板”一类需求,且任务属于 React Native 动效实现时使用。它把动效请求转化为能在真机发布构建上通过严格评审的实现,而不是只在模拟器或开发模式旗舰机上看起来没问题的代码。

主要能力

技能围绕移动端动画的三个本质约束组织内容:没有 hover,所有网页上依赖悬停的反馈必须重新设计到按压、位置或干脆不做;存在两个运行时,动画必须跑在 UI 线程上,任何触碰 React Native 运行时的动画都会在应用做别的事时卡顿;用户手指就在元素上,手势是最主要输入,可打断性和速度交接是基线要求。

具体覆盖:

  • 构建序列:先判断“该不该动”,再命名目的,然后按“最便宜且够用”的原则选工具,再选属性、定时或弹簧、保持离开 JS 线程、处理按压而非悬停、触觉反馈、减弱动态与无障碍。
  • 工具选型表:状态驱动无手势用 Reanimated CSS transition;循环、多阶段或挂载即播用 CSS animation;挂载/卸载或列表重排用布局动画;手指触碰或滚动派生用 useSharedValue + Gesture + useAnimatedStyle;屏幕间转场用 Expo Router 原生栈选项;作为独立屏幕的底部面板用 presentation: 'formSheet';标签栏用 NativeTabs;上下文菜单用 Link.Menu / Link.Preview;下拉刷新用 RefreshControl;跟随键盘的 UI 用 react-native-keyboard-controller;插画、庆祝、空状态用 Lottie;超大动画场景或自由绘制用 @shopify/react-native-skia。
  • 依赖安装:统一用 npx expo install <package> 安装,以匹配项目 SDK 版本。
  • 属性选择:transform 和 opacity 是“免费”的,其他属性每帧触发 Yoga 布局;唯一的例外是无子元素的绝对定位元素(如标签指示条、进度条填充)。禁止 scale(0),改用 scale(0.9–0.97) + opacity: 0。transform 数组顺序重要,translate 通常放前面。Android 阴影是 elevation,不要动画化 elevation,改为对预置阴影层做透明度交叉淡化。不要动画化 BlurView 的 intensity,改为对静态 BlurView 交叉淡化透明度。translate 中可使用百分比,相对元素自身尺寸。
  • 时序与弹簧:涉及手指就用弹簧,其余用定时。弹簧采用 Apple 的两个设计参数形式 { duration, dampingRatio },而不是 mass/stiffness/damping。给出默认稳定、拖拽回弹、面板/抽屉、不得越过硬边界等配置。缓动方面提供 strong ease-out、ease-in-out、iOS sheet 曲线等 cubicBezier / Easing.bezier 常量,并提醒 Reanimated 4.1.1 和 4.5.1 拒绝原始 'cubic-bezier(...)' 字符串。时长建议:按压反馈 100–150ms,开关/小状态变化 150–200ms,面板约 300ms 弹簧,屏幕转场沿用平台默认。
  • 保持离开 JS 线程:不要在 gesture 或 scroll handler 中 setState;不要在 onUpdate 或滚动处理器里 scheduleOnRN;不要在渲染期间读写共享值;使用 .get() / .set() 而非 .value;从 worklet 调用的函数首行需要 'worklet'。
  • 按压而非悬停:按下即反馈、松开提交;按钮类用 scale: 0.97、100–150ms;全宽列表行改为高亮背景;最小触控目标 44×44pt(Android 48dp),视觉小则加 hitSlop;设置 pressRetentionOffset;Android ripple 仅用于 Material 风格应用。
  • 触觉反馈:给出选择、轻击、中击、成功/失败通知的对应调用;三条绝对规则——与视觉同帧、每个用户操作一次、绝不作为唯一反馈;从 worklet 调用需 scheduleOnRN。
  • 减弱动态与无障碍:用 useReducedMotion 或 ReduceMotion.System;减弱意味着更少更温和而非为零,保留解释状态变化的透明度和颜色变化,去掉位移、缩放、视差和过冲;屏幕转场改为 animation: 'fade'。注意文字缩放,不要在默认字号下测量高度后动画到硬编码高度,改用 onLayout 测量或动画化 transform。
  • 静默破坏动效的配置排查:安装方式、babel-preset-expo 自动配置 worklets 插件、GestureHandlerRootView 必须包裹应用、Reanimated 4 要求新架构、Expo Go 不是性能环境、120fps 需 CADisableMinimumFrameDurationOnPhone。
  • 配方与“绝不发布”清单:按压反馈、拖拽关闭面板、滑动删除、折叠标题、列表入场、键盘同步 UI、标签指示器、屏幕转场等,建议从配方起步而非空文件;并列出常见错误及替代方案。

使用方式

当上游工作流与用户目标匹配时使用。按构建序列顺序执行,步骤 1 和 2 是门槛:若请求未通过“该不该动”的判断,应说明原因且不写代码。先命名目的(反馈、空间一致性、状态指示、避免突兀变化、解释、愉悦),无法命名就不构建。然后按“最便宜且够用”原则选择工具。技能强调以资深移动工程师姿态直接做决定、用一句话说明理由并写代码,不把动效选项当菜单呈现。

适用场景

适合 Expo / React Native 应用中的交互反馈、面板与抽屉、列表动画、手势驱动动效、屏幕转场、键盘跟随 UI、触觉反馈集成,以及需要兼顾减弱动态和无障碍的动效实现。也适合排查“动画就是不跑”一类配置问题。

限制

该技能聚焦移动端(Expo / React Native)动画,不覆盖 Web 动画。部分能力有平台限制,例如 Link.Menu / Link.Preview 和 headerLargeTitleEnabled 仅 iOS 可用;formSheet 是真实的 UISheetPresentationController;NativeTabs 来自 expo-router/unstable-native-tabs。Reanimated 4 要求新架构。性能判断必须在发布构建、最慢的支持设备上进行,Expo Go 和模拟器不算验证。文件末尾提到 RECIPES.md,但本资料未提供其完整内容,具体配方实现细节暂未提供。