react-native-reanimated
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseReact Native Reanimated
React Native Reanimated
Overview
概述
UI-thread animation library for React Native. Reanimated 4.x runs animations on the native UI thread for guaranteed 60fps performance, replacing Framer Motion for mobile applications. Provides shared values, animated styles, declarative entering/exiting transitions, and gesture integration.
Install: (included with Expo SDK 54+)
pnpm add react-native-reanimated一款用于React Native的UI线程动画库。Reanimated 4.x 在原生UI线程运行动画,可保证60fps的流畅性能,可替代移动端应用中的Framer Motion。它提供共享值、动画样式、声明式进入/退出过渡以及手势集成功能。
安装:(Expo SDK 54+ 已内置)
pnpm add react-native-reanimatedWorkflows
工作流程
Adding animations to a screen:
- Import from :
react-native-reanimated,Animated,useSharedValue,useAnimatedStylewithTiming - Create shared values for animated properties
- Define animated styles using
useAnimatedStyle - Apply to ,
Animated.View, etc.Animated.Text - Check and skip animations when true
useReducedMotion() - Test on device for smooth 60fps
Adding entering/exiting transitions:
- Import layout animations: ,
FadeInDown,FadeOutUp, etc.SlideInRight - Apply and
enteringprops onexitingAnimated.View - Chain modifiers:
.duration(300).easing(...).delay(100) - Verify reduced motion handling
为页面添加动画:
- 从导入:
react-native-reanimated、Animated、useSharedValue、useAnimatedStylewithTiming - 为动画属性创建共享值
- 使用定义动画样式
useAnimatedStyle - 将样式应用到、
Animated.View等组件Animated.Text - 检查,当返回值为true时跳过动画
useReducedMotion() - 在真机上测试以确保60fps流畅度
添加进入/退出过渡效果:
- 导入布局动画:、
FadeInDown、FadeOutUp等SlideInRight - 在上应用
Animated.View和entering属性exiting - 链式调用修饰符:
.duration(300).easing(...).delay(100) - 验证是否适配减少动画的设置
Guidance
指南
Core Primitives
核心原语
- : Mutable value that lives on UI thread
useSharedValue(initialValue) - : Derives style object from shared values
useAnimatedStyle(() => ({...})) - : Duration-based animation
withTiming(toValue, config) - : Physics-based spring animation
withSpring(toValue, config) - : Delay before animation starts
withDelay(ms, animation) - : Run animations in sequence
withSequence(...animations) - : Repeat animation
withRepeat(animation, count, reverse)
- :存储在UI线程的可变值
useSharedValue(initialValue) - :从共享值派生样式对象
useAnimatedStyle(() => ({...})) - :基于时长的动画
withTiming(toValue, config) - :基于物理规律的弹簧动画
withSpring(toValue, config) - :动画启动前的延迟
withDelay(ms, animation) - :按顺序运行多个动画
withSequence(...animations) - :重复动画
withRepeat(animation, count, reverse)
Standard Timing Configs
标准时长配置
Consistent with demo-development.md durations:
| Type | Duration | Use |
|---|---|---|
| Fast | 150ms | Micro-interactions, haptic responses |
| Normal | 300ms | Default transitions, entering |
| Slow | 500ms | Emphasis, screen transitions |
| Stagger offset | 50ms per item | List item reveals |
Easing: for entrances, for transitions, for exits.
Easing.out(Easing.cubic)Easing.inOut(Easing.cubic)Easing.in(Easing.cubic)与demo-development.md中的时长保持一致:
| 类型 | 时长 | 适用场景 |
|---|---|---|
| 快速 | 150ms | 微交互、触觉反馈 |
| 常规 | 300ms | 默认过渡、进入效果 |
| 慢速 | 500ms | 强调效果、页面过渡 |
| 交错偏移 | 每项50ms | 列表项逐个展示 |
缓动函数:进入效果使用,过渡效果使用,退出效果使用。
Easing.out(Easing.cubic)Easing.inOut(Easing.cubic)Easing.in(Easing.cubic)Declarative Entering/Exiting
声明式进入/退出动效
Apply directly to — no parent wrapper needed (unlike AnimatePresence):
Animated.View- Entering: ,
FadeIn,FadeInDown,FadeInUp,SlideInRightZoomIn - Exiting: ,
FadeOut,FadeOutUp,FadeOutDown,SlideOutLeftZoomOut - Chain modifiers: ,
.duration(300),.delay(100).easing(Easing.out(Easing.cubic)) - Spring:
.springify().damping(15).stiffness(150)
可直接应用到上——无需父级包装器(与AnimatePresence不同):
Animated.View- 进入动效:、
FadeIn、FadeInDown、FadeInUp、SlideInRightZoomIn - 退出动效:、
FadeOut、FadeOutUp、FadeOutDown、SlideOutLeftZoomOut - 链式修饰符:、
.duration(300)、.delay(100).easing(Easing.out(Easing.cubic)) - 弹簧效果:
.springify().damping(15).stiffness(150)
Stagger Pattern
交错动画模式
Use with index multiplication:
withDelayentering={FadeInDown.delay(index * 50).duration(300)}Or for imperative animations:
offset.value = withDelay(index * 50, withTiming(1, { duration: 300 }))结合和索引相乘实现:
withDelayentering={FadeInDown.delay(index * 50).duration(300)}或者用于命令式动画:
offset.value = withDelay(index * 50, withTiming(1, { duration: 300 }))Accessibility — Reduced Motion
无障碍适配——减少动画
Always respect the user's accessibility preference:
const reducedMotion = useReducedMotion();When is true:
reducedMotion- Skip all animations (set values instantly)
- Use or don't apply entering/exiting props
duration(0) - Still show content — just don't animate it
始终尊重用户的无障碍偏好设置:
const reducedMotion = useReducedMotion();当为true时:
reducedMotion- 跳过所有动画(直接设置值)
- 使用或不添加进入/退出属性
duration(0) - 仍需展示内容——只是不添加动画
Animated Components
动画组件
Use , , , etc. Or create animated versions:
Animated.ViewAnimated.TextAnimated.ScrollViewconst AnimatedPressable = Animated.createAnimatedComponent(Pressable);使用、、等,或者自定义动画版本:
Animated.ViewAnimated.TextAnimated.ScrollViewconst AnimatedPressable = Animated.createAnimatedComponent(Pressable);Performance
性能优化
- Animate only and
transform— these run on the UI threadopacity - Avoid animating ,
width,height,margin(causes layout recalculation)padding - Shared values update on UI thread without JS bridge overhead
- worklets run on UI thread — keep them pure
useAnimatedStyle - For lists, use /
enteringon items rather than animating the containerexiting
- 仅对和
transform属性做动画——这些属性在UI线程运行opacity - 避免对、
width、height、margin做动画(会触发布局重计算)padding - 共享值在UI线程更新,无需JS桥接开销
- 工作单元在UI线程运行——保持逻辑纯净
useAnimatedStyle - 对于列表,在列表项上使用进入/退出动效,而非为容器添加动画
Best Practices
最佳实践
- Use declarative /
enteringfor mount/unmount animations — simpler than manual shared valuesexiting - Prefer for natural-feeling interactions (drag, gestures)
withSpring - Prefer for UI transitions (screen enter, fade in)
withTiming - Always check before applying animations
useReducedMotion() - Keep standard durations consistent: 150ms / 300ms / 500ms
- Use for staggered list reveals
withDelay(index * 50, ...) - Combine with for gesture-driven animations
react-native-gesture-handler - Use as default easing for entrances
Easing.out(Easing.cubic)
- 对于挂载/卸载动画,使用声明式的/
entering——比手动管理共享值更简单exiting - 对于自然交互(拖拽、手势),优先使用
withSpring - 对于UI过渡(页面进入、淡入),优先使用
withTiming - 在应用动画前,始终检查
useReducedMotion() - 保持标准时长一致:150ms / 300ms / 500ms
- 使用实现列表项交错展示
withDelay(index * 50, ...) - 结合实现手势驱动动画
react-native-gesture-handler - 进入效果默认使用缓动函数
Easing.out(Easing.cubic)
Anti-Patterns
反模式
- Using React Native's built-in API instead of Reanimated
Animated - Animating layout properties (,
width,height) — usemarginandtransformopacity - Forgetting accessibility check
useReducedMotion() - Running JS-thread-heavy logic inside worklets
useAnimatedStyle - Hardcoding duration values (use constants: 150/300/500ms)
- Nesting many animated views unnecessarily (performance overhead)
- Using for stagger instead of
setTimeoutwithDelay - Applying entering animations without testing on real device
- 使用React Native内置的API而非Reanimated
Animated - 对布局属性(、
width、height)做动画——应使用margin和transformopacity - 忘记做无障碍检查
useReducedMotion() - 在工作单元中运行大量JS线程密集型逻辑
useAnimatedStyle - 硬编码时长值(使用常量:150/300/500ms)
- 不必要地嵌套多个动画视图(会产生性能开销)
- 使用实现交错效果而非
setTimeoutwithDelay - 未在真机上测试就应用进入动画