跳转到使用指南
animate-expo作者 Emil Kowalski

Animate Expo Skill.

一个用于移动应用设计的 Claude Code 和 Codex skill:为 React Native 和 Expo 提供手势、弹簧动画和转场效果。

  • Mobile Apps
  • UI 代码
emilkowalski/skills · skills/animate-expo/SKILL.mdSKILL.md
--- name: animate-expo description: Build animations in React Native and Expo, making the decisions in the order that determines whether they feel right — should it animate, which thread it runs on, which properties, spring or timing, how the gesture hands off, how it degrades. Writes the implementation with Reanimated, Gesture Handler, Expo Router and expo-haptics. Use when animating anything in an Expo app, adding gestures, sheets, screen … --- ## Operating Posture ## Hard Rules ## The Build Sequence ## Setup that silently breaks motion ## 120fps ## Recipes
上游文件前置元数据与章节标题,读取于 2026-09-14 · 全文 17,458 字符

01 功能说明

animate-expo skill 在 Claude Code 和 Codex 中的作用

摘要、工作流与产物,均读自该 skill 的 SKILL.md。

来自 SKILL.md读取于 2026-09-14 · 非实际运行记录

以 skill 自身的术语

这是一款用于 React Native 与 Expo 动效构建的 skill。它能把一个动画需求转化为经得起真机评审的实现,并按照决定其是否「感觉对」的顺序来做出各项决策:是否应该动起来、运行在哪个线程上、作用于哪些属性、用 spring 还是 timing、手势如何交接、如何降级。

一切都源自三个移动端事实:没有 hover,存在两套运行时,并且用户的手指就在元素上。这适用于任何为 Expo 应用添加动画、手势、sheet、屏幕转场、按压反馈或 haptics 的场景,也适用于修复在设备上出现卡顿的动效。代码基于 Reanimated、Gesture Handler、Expo Router 和 expo-haptics 编写。

它产出什么

  • 直接编写的实现代码本身,而不是作为可选方案提供。
  • 一份简短的 gate 结果,说明频率层级和具名用途,并列出哪些被拒绝及原因。
  • 要素行:工具、属性、弹簧或曲线加时长,以及工作在哪个运行时上执行。
  • 设备上需要凭手感检查的一份清单,因为手势交接和触感反馈的时机无法从代码中读出。
查看示例提示词 ↗

工作方式

  1. 01
    先给动画设一道闸,别急着做别的

    频率表决定动效是否会发生;最高档直接停止,不写任何代码。切换标签页从不使用滑动,因为标签是同级关系,而非层级关系。

  2. 02
    用一个词说明目的

    该 skill 要求在继续之前先明确一个单词的意图——反馈、空间一致性、状态提示、避免突兀的变化、解释,或惊喜感(惊喜感仅用于罕见的首次体验时刻)。

  3. 03
    选择能用的、最便宜的工具

    逐行检查表格,在第一个匹配的行停下:CSS transition、CSS keyframes、layout animation、shared value 加 Gesture,然后是 native stack、formSheet、NativeTabs、Link.Menu、RefreshControl、Lottie 或 Skia。

  4. 04
    限制可动画的属性

    Transform 和 opacity 几乎不消耗性能;其他属性都会触发布局计算,每一帧都要在该节点及其兄弟节点上重新运行 Yoga。

  5. 05
    从 Finger 中选择 Spring 或 Timing

    任何由手指驱动的交互都会带有一个 spring,让速度能够贯穿中断过程;其他所有交互则使用 timing curve,绝不使用 ease-in。

  6. 06
    让 Frame 远离 JS 线程

    共享值会驱动 useAnimatedStyle,而不是 React 状态,RN-runtime 调用会被推迟到 onEnd 或阈值触发的反应中,而不是在手势更新内部直接触发。

02 找到适合场景

何时使用 animate-expo Skill

在做这类移动应用设计工作时,在 Claude Code 或 Codex 中使用 animate-expo skill。下方的适用范围和限制取自该 skill 自己的文件。

适合场景

  • 为 Expo 应用中的任何内容添加动画,包括手势、sheet、屏幕转场、按压反馈和触觉反馈。
  • 涉及手指操作的动效,因此可中断性和速度交接被视为基线,而非锦上添花。
  • 与某个命名 recipe 匹配的请求,此时应从该 recipe 开始,而不是从空白文件开始。
  • 为一个没有 hover 的平台重新设计网页可交互元素,其中 hover 状态必须转化为按压、位置变化,或直接取消。

了解边界

  • 网页动画,属于另一个 skill。
  • 在 Expo Go 中测试动效并不能反映真实性能环境,会掩盖需要排查的问题。
  • 未通过频率限制检查的请求——该 skill 会说明原因并拒绝编写该动画。
  • 仍处于旧架构的项目,因为 Reanimated 4 需要新架构。

需要提供的信息

  • 交互及其发生频率频率层级决定了是否需要构建任何东西;标签切换、键盘打开与关闭、滚动以及设置切换都处于最高层级。
  • 用一个词命名目的没有一个可命名的目的,就不存在构建。
  • 项目所需的包,通过 Expo 安装安装经由 Expo CLI 完成,这样版本会针对项目的 SDK 解析,而普通的 npm install 做不到这一点。

03 Skill 内部

animate-expo Skill 给 Claude Code 和 Codex 定下的规则

SKILL.md 为 Agent 设定的 8 条具体指令、默认值与限制——文件中真正改变结果的部分。

  1. 按顺序执行各步骤

    第 1 步和第 2 步是后续一切的前置,所以在选定任何工具或属性之前,必须先确定频率与具名用途。

  2. 用 Reanimated,不用 Core Animated

    Core Animated 无法在不跨过 bridge 的情况下被手势驱动,而 useNativeDriver 除 transform 和 opacity 之外一概拒绝。

  3. 没有近似值

    曲线和 spring 配置必须取自文件中的表格,不能自行编造。

  4. 减弱动效与动画一同交付

    无障碍处理属于同一处改动,不是后续单子。

  5. 只在 release 构建上判断手感

    验证要在你支持的最慢设备上、用 release 构建进行;模拟器和 dev 构建不算数。

  6. 使用 Apple 的两个 spring 参数

    Spring 写作 duration 加 dampingRatio 加 velocity,而不是 mass、stiffness 和 damping;默认稳定为 { duration: 400, dampingRatio: 1 },当硬边界必须守住时用 overshootClamping: true。

  7. 尊重触摸目标

    iOS 上至少 44x44pt、Android 上至少 48dp,用 hitSlop 实现而不是放大视觉元素,再加上 pressRetentionOffset,以免手指滑动取消一次按压。

  8. 每次用户操作只触发一次触感反馈

    触感反馈与视觉在同一帧、同一因果时刻触发,绝不在滚动时或逐帧触发,也绝不作为唯一的反馈。

04 投入使用

在 Claude Code 或 Codex 中安装 animate-expo

一条 npx skills add 命令,然后在你的 Agent 中执行第一个任务和对结果的清单检查。

将 animate-expo 添加到 Claude Code、Codex 或你的 Agent

在你的项目中运行;安装程序会询问要把它添加到哪个 Agent。

Terminal
npx skills add https://github.com/emilkowalski/skills --skill animate-expo

skills/animate-expo/SKILL.md 的通用 skills CLI 形式;仓库可能自行记录其路径。

给 Skill 第一个移动应用设计任务

按 skill 自身的术语撰写;把括号中的部分换成你的内容。

Starter prompt
In my Expo app the [filter sheet] is a bottom sheet people open a few times a session, and dragging it down should dismiss it, snapping back if the drag was short. Add press feedback to the [row component] in the list and a selection haptic when the sheet detent catches. Keep all of it on the UI thread — nothing should stutter on a three-year-old Android — and ship reduced-motion handling in the same change.

来源:依据 SKILL.md,按 skill 自身的术语撰写。

检查首次结果

SKILL.md 本身如何描述正确的结果:

  • 在设备上手动驱动交互:轻甩它、在半途打断它、反向执行它。
  • 确认 ProMotion iPhone 上存在 CADisableMinimumFrameDurationOnPhone,因为近期的 Expo SDK 会默认设置它。
  • 检查减弱动效是否降级为更少、更柔和,而不是归零,并保留 opacity 和颜色的说明作用。
  • 当什么都跑不起来时,先查那些不出声的破坏者:worklets Babel 插件,以及包住应用的 GestureHandlerRootView。

在 OpenDesign 中从 animate-expo 的 SKILL.md 链接导入:Plugins → Add → Skill → Import from link,然后在顶栏中选中它。

05 开源、可追溯

来源、许可与验证

本页面事实的来源,以及最后检查时间。

Repository
github.com/emilkowalski/skills 分支 main
Skill 文件
skills/animate-expo/SKILL.md 验证时记录的内容校验和;提交 d23d7f8
License
MIT 来自 LICENSE。
仓库星标数
37,516 GitHub 快照拍摄于 2026-09-14,针对整个 emilkowalski/skills 仓库,该仓库在此目录中包含 9 个 skills。不是 animate-expo 的评分或使用计数。
已由 OpenDesign 验证
2026-09-14 已检查源文件、路径、许可文本和 star 数量。未内置在 OpenDesign 主程序(检查日期 2026-08-28);本页面未记录实际运行。

SKILL.md 内部

  1. 工作姿态以资深工程师的方式行事:做决定,用一句话说明理由,写代码。
  2. 硬性规则五条不可妥协的原则:顺序编排、Reanimated、以表格列出的数值、减弱动态效果、以 release 构建来判断。
  3. 构建顺序九个有序步骤,从频率闸门出发,依次经过属性、弹簧、线程与触感反馈。
  4. 会悄悄让动效失效的配置安装、Babel 插件、根视图与架构这四个环节中,让动画根本不运行的原因。
  5. 120fps启用 CADisableMinimumFrameDurationOnPhone,让 ProMotion iPhone 拿到 8ms 的帧预算。
  6. 配方指向 RECIPES.md,涵盖按压反馈、面板、滑动、头部、键盘 UI 与标签页。
  7. 绝不上线双列表格,把被禁止的写法与应改用的替代方案一一配对。
  8. 输出代码,外加几行说明:闸门结果、构成要素,以及需要上手感受检查的地方。
  9. 语气有明确主张且简短;某处根本不该有动画时,直接说出来。
Skill 自身的描述
"在 React Native 和 Expo 中构建动画,按决定手感是否正确的顺序做决策——是否应该有动画、在哪个线程运行、哪些属性、弹簧还是时序、手势如何交接、如何降级。使用 Reanimated、Gesture Handler、Expo Router 和 expo-haptics 编写实现代码。用于在 Expo 应用中制作任何动画、添加手势、底部抽屉、屏幕过渡、按压反馈或触觉反馈,或修复在设备上卡顿的动效。若要做 Web 动画请使用 `animate`。"

来自 SKILL.md 的 front-matter 描述。完整文件约 17,458 个字符。在 GitHub 上阅读完整文件。

06 安装之前

关于 animate-expo skill 的问题

以下回答来自 2026-09-14 读取到的 SKILL.md,而非某次实际运行的记录。

为什么用 Reanimated 而不是核心 Animated API?

核心 Animated 要由手势驱动就必须跨过 bridge,而 useNativeDriver 除 transform 和 opacity 之外一概不接受。Reanimated 的 worklet 跑在 UI 线程上,JS 繁忙时也照常执行。

如果这个交互一天要发生几十次,会怎样?

对最高频率档位,闸门会直接判定不做任何动画 — 用平台默认效果,或者什么都不做,到此为止。动画只留给偶发、罕见的时刻,比如面板、模态、toast 和成功状态。

Animate Expo

在真实移动应用设计任务中运行 animate-expo。

下载 OpenDesign,从其 SKILL.md 链接导入 animate-expo,粘贴上述提示词,在结果出现前阅读计划。

终端
npx skills add https://github.com/emilkowalski/skills --skill animate-expo

OpenDesign 桌面客户端

一套设计系统,让每一次创作都保持品牌一致

在完整的 Vibe Design Workspace 中,用同一套品牌规则生成网页、PPT、可交互原型、数据看板、图像与 HTML 视频。连接本地 Codex、Claude Code、Cursor 等编程助手,即可免费创作。

  • 覆盖网页、PPT、原型、数据看板、图像与视频
  • 140+ 设计系统,以及完整模板与技能库
  • 连接本地 Codex 与 21+ 款编程助手 · 免费使用
免费下载

支持 macOS 与 Windows