React Native 的动画系统提供了一种灵活高效的方式来在您的应用程序中创建各种动画。本文档解释了 React Native 动画系统的架构、组件和使用模式。
React Native 提供了两个互补的动画系统
Animated API:用于创建具有精细控制的精确、交互式动画Animated API 主要用于插值动画,而布局动画则用于在布局发生变化时自动执行动画。
Animated API 以输入和输出之间的声明性关系为中心,中间包含可配置的转换,以及简单的启动/停止方法来控制基于时间的动画执行。
来源
动画系统的核心围绕着 AnimatedValue 节点构建,这些节点代表可以随时间动画化的值。这些值可以是
这些值节点可以通过加、减、乘、除等运算组合,创建复杂的动画。
来源
React Native 提供了三种动画类型
原生驱动是一项关键的性能优化,它允许动画在原生 UI 线程而不是 JavaScript 线程上运行。这可以防止动画受到 JavaScript 线程阻塞的影响。
要使用原生驱动,您可以在动画配置中设置 useNativeDriver: true。只有某些属性才能通过原生驱动进行动画处理
transform 属性opacitybackgroundColor(在某些平台上)borderBottomColor, borderEndColor, 等。来源
React Native 提供了一组使用 createAnimatedComponent 函数构建的预动画组件
来源
当您使用 createAnimatedComponent 创建动画组件时,它会包装一个标准的 React Native 组件并添加动画化其属性的功能。工作原理如下:
createAnimatedComponent 函数返回一个包装了原始组件的新 React 组件useAnimatedProps hook 来处理 props 中的动画值来源
React Native 提供了几种组合动画的方式
插值允许您将输入范围映射到输出范围,并带有可选的缓动函数。
来源
布局动画提供了一种在视图布局更改时自动为其新位置设置动画的方法。此系统独立于 Animated API,通常用于动画化添加、删除或重新排列视图时发生的布局更改。
来源
布局动画按以下步骤处理
LayoutAnimation.configureNext() 配置布局动画LayoutAnimationKeyFrameManager 处理这些更改LayoutAnimationKeyFrameManager 为动画生成关键帧FabricMountingManager,iOS 上的 RCTMountingManager)将这些关键帧应用于视图,以动画化其新位置动画系统与 React Native 的挂载管线集成,以高效地应用动画
来源
当动画运行时
useNativeDriver: false),JavaScript 线程会在每一帧计算新值并更新组件 propsuseNativeDriver: true),动画通过原生动画模块完全在 UI 线程上运行LayoutAnimationKeyFrameManager 会截获布局更改,并创建在挂载过程中应用的动画关键帧动画系统对 ScrollView 组件中的吸顶标题进行了特殊处理,使用 AnimatedInterpolation 来计算用户滚动时标题的位置。
来源
React Native 包含多项优化,以使动画更具内存效率
FlatList 和 ScrollView 等组件的视图回收来源
| 类型 | 描述 |
|---|---|
Animated.Value | 用于驱动动画的单个值 |
Animated.ValueXY | 用于驱动 2D 动画(例如平移手势)的 2D 值 |
Animated.Color | 用于动画化颜色属性的专用值 |
Animated.timing() | 使用缓动函数随时间动画化一个值 |
Animated.spring() | 创建弹簧动画 |
Animated.decay() | 以初始速度开始并逐渐减速停止 |
Animated.sequence() | 按顺序运行动画 |
Animated.parallel() | 并行运行动画 |
Animated.stagger() | 以交错的延迟启动动画 |
Animated.loop() | 循环动画 |
Animated.View, Animated.Text 等 | 预包装的动画组件 |
Animated.createAnimatedComponent() | 创建新的动画组件 |
来源
React Native 的动画系统提供了一种灵活高效的方式来创建应用程序中的动画。无论您需要 Animated API 的精确控制,还是 LayoutAnimation 的自动布局动画,React Native 都为您提供了创建流畅且引人入胜的用户体验的工具。
有关手势处理(通常与动画配合使用)的信息,请参阅 手势响应系统。