跳到主要内容
版本:0.82

动画

Animated 库旨在使动画流畅、强大且易于构建和维护。Animated 专注于输入和输出之间的声明式关系、中间可配置的变换,以及用于控制基于时间的动画执行的 start/stop 方法。

创建动画的核心工作流程是创建一个 Animated.Value,将其挂钩到动画组件的一个或多个样式属性,然后通过使用 Animated.timing() 的动画来驱动更新。

备注

不要直接修改 animated value。你可以使用 useRef Hook 来返回一个可变的 ref 对象。此 ref 对象的 current 属性被初始化为给定的参数,并在组件生命周期中持久存在。

示例​

以下示例包含一个 View,它将基于 animated value fadeAnim 淡入和淡出

参阅 动画 指南以查看 Animated 的更多示例。

概述​

你可以使用两种类型的值与 Animated 配合:

Animated.Value 可以绑定到样式属性或其他 props,也可以进行插值。单个 Animated.Value 可以驱动任意数量的属性。

配置动画​

Animated 提供三种类型的动画。每种动画类型提供特定的动画曲线,控制你的值如何从初始值动画到最终值:

在大多数情况下,你将使用 timing()。默认情况下,它使用对称的 easeInOut 曲线,传达物体逐渐加速到全速并通过逐渐减速到停止的过程。

使用动画​

通过在动画上调用 start() 来启动动画。start() 接受一个完成回调,当动画完成时将调用该回调。如果动画正常完成,完成回调将被 invoked with {finished: true}。如果动画是因为在完成之前调用了 stop() 而完成(例如,因为它被手势或另一个动画中断),那么它将收到 {finished: false}。

React TSX
Animated.timing({}).start(({finished}) => {
/* 完成回调 */
});

使用原生驱动​

通过使用原生驱动,我们在启动动画之前将有关动画的所有内容发送到原生端,允许原生代码在 UI 线程上执行动画,而不必在每一帧上都通过桥接。一旦动画开始,JS 线程可以被阻塞而不影响动画。

你可以通过在动画配置中指定 useNativeDriver: true 来使用原生驱动。请参阅 动画 指南以了解更多。

可动画组件​

只有可动画组件可以被动画化。这些独特的组件完成了将 animated values 绑定到属性的魔法,并进行有针对性的原生更新,以避免每一帧上 React 渲染和协调过程的成本。它们还处理卸载时的清理,因此默认情况下是安全的。

Animated 使用上述包装器导出以下可动画组件:

  • Animated.Image
  • Animated.ScrollView
  • Animated.Text
  • Animated.View
  • Animated.FlatList
  • Animated.SectionList

组合动画​

动画也可以使用组合函数以复杂的方式组合:

动画也可以通过将一个动画的 toValue 设置为另一个 Animated.Value 来链接在一起。请参阅动画指南中的 跟踪动态值。

默认情况下,如果一个动画停止或中断,则组中的所有其他动画也会停止。

组合 animated values​

你可以通过加法、减法、乘法、除法或取模来组合两个 animated values 以制作一个新的 animated value:

插值​

interpolate() 函数允许输入范围映射到不同的输出范围。默认情况下,它将外推超出给定范围的曲线,但你也可以让它钳制输出值。默认情况下它使用线性插值,但也支持缓动函数。

在 动画 指南中阅读更多关于插值的信息。

处理手势和其他事件​

手势(如平移或滚动)和其他事件可以使用 Animated.event() 直接映射到 animated values。这是通过结构化映射语法完成的,以便可以从复杂的事件对象中提取值。第一级是一个数组,允许跨多个参数进行映射,该数组包含嵌套对象。

例如,当使用水平滚动手势时,你将执行以下操作以将 event.nativeEvent.contentOffset.x 映射到 scrollX(一个 Animated.Value):

React TSX
onScroll={Animated.event(
// scrollX = e.nativeEvent.contentOffset.x
[{nativeEvent: {
contentOffset: {
x: scrollX
}
}
}]
)}

参考

方法​

当给定值是 ValueXY 而不是 Value 时,每个配置选项可以是形式为 {x: ..., y: ...} 的向量,而不是标量。

decay()​

React TSX
static decay(value, config): CompositeAnimation;

基于衰减系数将值从初始速度动画化到零。

Config 是一个对象,可能具有以下选项:

  • velocity:初始速度。必需。
  • deceleration:衰减率。默认 0.997。
  • isInteraction:此动画是否在 InteractionManager 上创建“交互句柄”。默认 true。
  • useNativeDriver:当 true 时使用原生驱动。必需。

timing()​

React TSX
static timing(value, config): CompositeAnimation;

沿定时缓动曲线动画化一个值。Easing 模块有很多预定义的曲线,或者你可以使用自己的函数。

Config 是一个对象,可能具有以下选项:

  • duration:动画长度(毫秒)。默认 500。
  • easing:定义曲线的缓动函数。默认是 Easing.inOut(Easing.ease)。
  • delay:在延迟后启动动画(毫秒)。默认 0。
  • isInteraction:此动画是否在 InteractionManager 上创建“交互句柄”。默认 true。
  • useNativeDriver:当 true 时使用原生驱动。必需。

spring()​

React TSX
static spring(value, config): CompositeAnimation;

根据基于 阻尼谐振荡 的解析弹簧模型动画化一个值。跟踪速度状态以在 toValue 更新时创建流畅的运动,并且可以链接在一起。

Config 是一个对象,可能具有以下选项。

请注意,你只能定义 bounciness/speed、tension/friction 或 stiffness/damping/mass 中的一组,而不能定义多组:

friction/tension 或 bounciness/speed 选项匹配 Facebook Pop、Rebound 和 Origami 中的弹簧模型。

  • friction:控制“弹性”/过冲。默认 7。
  • tension:控制速度。默认 40。
  • speed:控制动画速度。默认 12。
  • bounciness:控制弹性。默认 8。

指定 stiffness/damping/mass 作为参数会使 Animated.spring 使用基于 阻尼谐振荡 运动方程的解析弹簧模型。这种行为稍微更精确且忠实于弹簧动力学背后的物理原理,并密切模仿 iOS 的 CASpringAnimation 中的实现。

  • stiffness:弹簧刚度系数。默认 100。
  • damping:定义弹簧的运动应如何因摩擦力而阻尼。默认 10。
  • mass:附着在弹簧末端的物体的质量。默认 1。

其他配置选项如下:

  • velocity:附着在弹簧上的物体的初始速度。默认 0(物体静止)。
  • overshootClamping:布尔值,指示弹簧是否应被钳制且不反弹。默认 false。
  • restDisplacementThreshold:低于此值的静止位移阈值,弹簧应被视为静止。默认 0.001。
  • restSpeedThreshold:弹簧应被视为静止的速度(像素每秒)。默认 0.001。
  • delay:在延迟后启动动画(毫秒)。默认 0。
  • isInteraction:此动画是否在 InteractionManager 上创建“交互句柄”。默认 true。
  • useNativeDriver:当 true 时使用原生驱动。必需。

add()​

React TSX
static add(a: Animated, b: Animated): AnimatedAddition;

创建一个由两个 Animated values 相加组成的新 Animated value。


subtract()​

React TSX
static subtract(a: Animated, b: Animated): AnimatedSubtraction;

创建一个由第一个 Animated value 减去第二个 Animated value 组成的新 Animated value。


divide()​

React TSX
static divide(a: Animated, b: Animated): AnimatedDivision;

创建一个由第一个 Animated value 除以第二个 Animated value 组成的新 Animated value。


multiply()​

React TSX
static multiply(a: Animated, b: Animated): AnimatedMultiplication;

创建一个由两个 Animated values 相乘组成的新 Animated value。


modulo()​

React TSX
static modulo(a: Animated, modulus: number): AnimatedModulo;

创建一个作为提供的 Animated value 的(非负)模的新 Animated value


diffClamp()​

React TSX
static diffClamp(a: Animated, min: number, max: number): AnimatedDiffClamp;

创建一个限制在 2 个值之间的新 Animated value。它使用与最后一个值的差值,因此即使值远离边界,当值再次开始接近时它也将开始变化。(value = clamp(value + diff, min, max))。

这对于滚动事件很有用,例如,向上滚动时显示导航栏,向下滚动时隐藏它。


delay()​

React TSX
static delay(time: number): CompositeAnimation;

在给定的延迟后启动动画。


sequence()​

React TSX
static sequence(animations: CompositeAnimation[]): CompositeAnimation;

按顺序启动动画数组,等待每个动画完成后再启动下一个。如果当前正在运行的动画停止,则不会启动后续动画。


parallel()​

React TSX
static parallel(
animations: CompositeAnimation[],
config?: ParallelConfig
): CompositeAnimation;

同时启动动画数组。默认情况下,如果其中一个动画停止,它们都将停止。你可以使用 stopTogether 标志覆盖此行为。


stagger()​

React TSX
static stagger(
time: number,
animations: CompositeAnimation[]
): CompositeAnimation;

动画数组可以并行运行(重叠),但按顺序启动并具有连续延迟。适合做拖尾效果。


loop()​

React TSX
static loop(
animation: CompositeAnimation[],
config?: LoopAnimationConfig
): CompositeAnimation;

连续循环给定的动画,以便每次到达结束时,它都会重置并从开始重新开始。如果子动画设置为 useNativeDriver: true,则循环将不会阻塞 JS 线程。此外,循环可以防止基于 VirtualizedList 的组件在动画运行时渲染更多行。你可以在子动画配置中传递 isInteraction: false 来修复此问题。

Config 是一个对象,可能具有以下选项:

  • iterations:动画应循环的次数。默认 -1(无限)。

event()​

React TSX
static event(
argMapping: Mapping[],
config?: EventConfig
): (...args: any[]) => void;

接受映射数组并相应地从每个参数中提取值,然后在映射的输出上调用 setValue。例如

React TSX
onScroll={Animated.event(
[{nativeEvent: {contentOffset: {x: this._scrollX}}}],
{listener: (event: ScrollEvent) => console.log(event)}, // 可选异步监听器
)}
...
onPanResponderMove: Animated.event(
[
null, // 原始事件参数被忽略
{dx: this._panX},
], // gestureState 参数
{
listener: (
event: GestureResponderEvent,
gestureState: PanResponderGestureState
) => console.log(event, gestureState),
} // 可选异步监听器
);

Config 是一个对象,可能具有以下选项:

  • listener:可选异步监听器。
  • useNativeDriver:当 true 时使用原生驱动。必需。

forkEvent()​

React JSX
static forkEvent(event: AnimatedEvent, listener: Function): AnimatedEvent;

用于窥探通过 props 传递的 animated 事件的高级命令式 API。它允许向现有的 AnimatedEvent 添加新的 javascript 监听器。如果 animatedEvent 是 javascript 监听器,它将合并 2 个监听器为一个,如果 animatedEvent 是 null/undefined,它将直接分配 javascript 监听器。尽可能直接使用值。


unforkEvent()​

React JSX
static unforkEvent(event: AnimatedEvent, listener: Function);

start()​

React TSX
static start(callback?: (result: {finished: boolean}) => void);

通过在动画上调用 start() 来启动动画。start() 接受一个完成回调,当动画完成或在动画完成前调用 stop() 导致动画完成时将调用该回调。

参数:

名称类型必需描述
callback(result: {finished: boolean}) => void否动画正常完成后或在动画完成前调用 stop() 导致动画完成时将调用的函数

带回调的启动示例:

React TSX
Animated.timing({}).start(({finished}) => {
/* 完成回调 */
});

stop()​

React TSX
static stop();

停止任何正在运行的动画。


reset()​

React TSX
static reset();

停止任何正在运行的动画并将值重置为其原始值。

Properties​

Value​

A standard value class used to drive animations. It is typically initialized in class components with useAnimatedValue(0); or new Animated.Value(0);.

You can learn more about the Animated.Value API on the separate page.


ValueXY​

A 2D value class used to drive 2D animations, such as pan gestures.

You can learn more about the Animated.ValueXY API on the separate page.


Interpolation​

Exported for use as an Interpolation type in Flow.


Node​

Exported for type checking. All animated values derive from this class.


createAnimatedComponent​

Makes any React component animatable. Used to create Animated.View and similar components.


attachNativeEvent​

An imperative API for attaching animated values to events on a view. When possible, Animated.event with useNativeDriver: true is preferred.