官方动画文档
Overview
Animated
可以使用2种值类型:
-
Animated.Value()
单一值,能够绑定样式属性或者其它属性,也可以使用插值,单个 Animated.Value 能够驱动任意数量的属性 -
Animated.ValueXY()
容器(vectors)
Configuring animations
Animated
提供了3种动画类型。每种动画类型提供了特定的用于控制从初始值到结束值的动画曲线
-
Animated.decay()
: 以一个初始速度开始,然后渐渐的停止 -
Animated.spring()
: 提供简单的弹簧物理模型 -
Animated.timing()
: 使用 easing function 基于时间的动画 (easeInOut
曲线,先快后慢)
Working with animations
可以通过调用 start()
方法开始动画,start()
方法还可以接收一个动画完成之后的回调函数。如果动画正常的结束,完成回调函数将返回 {finished: true}
.如果动画在其正常完成之前因为调用 stop()
方法完成(比如被手势中断或者其它动画中断),它将返回 {finished: false}
Using the native driver
通过使用native driver,在开始动画之前将所有动画相关的信息都发送给原生,允许原生代码在UI thread上进行动画,而不需要在每一帧都都通过桥连接。一旦动画开始,JS线程将被阻塞而不影响动画。
可以在动画配置中指定 useNativeDriver: true
来使用原生驱动。
Animatable components
只有可动画组件才能进行动画。这个特殊的组件将动画值绑定到属性上,并且做目标原生更新,这样能避免react对每一帧进行渲染和调和过程(reconciliation process)的花销。它们也会在unmount时做清理工作因此它们默认是安全的。
-
createAnimatedComponent()
可以用于使一个组件animatable
Animated
库使用上面的方法导出了下列可动画的组件:
Animated.View
Animated.ScrollView
Animated.Text
Animated.Image
Composing animations
动画可以结合复合函数组成复杂的动画:
-
Animated.delay()
在给定的delay之后开始动画 -
Animated.parallel()
同时开始多个动画 -
Animated.sequence()
按顺序开始动画,下一个动画在上一个动画结束之后开始 -
Animated.stagger()
按顺序和并行的开始动画,每个动画都给一个delay
动画可以连接起来(chain together),通过简单的设置一个动画的 toValue
值成为另一个动画的 Animated.Value
值, 详情见 tracking dynamic values.
默认情况下,如果一个动画停止或者被终止,则动画组中的所有其它动画都会停止
combining animated values
可以通过 addition | multiplication | division | modulo
将2个动画值结合成一个新的动画值
Animated.add()
Animated.divide()
Animated.modulo()
Animated.multiply()
Interpolation
interpolation()
方法允许输入范围映射为不同的输出范围。默认情况,它会根据给定输入范围外扩输出曲线,但是也可以压缩输出曲线。默认使用线性插值,但是也支持缓动函数
interpolate()
Handling gestures and other events
像panning或者 scrolling手势 和其它时间能够通过 Animated.event
直接映射为动画值。这是通过结构性的映射语法完成的,因此值能够从复杂的event 对象中提取出来。第一级是一个允许通过多个args映射的数组,这个数组包含嵌套的对象
Animated.event()
例如,当处理水平scrolling手势,你可能像下面那样做,为了将 event.nativeEvent.contentOffset.x
映射为 scrollX
(一个Animated.Value)
onScroll = {
Animated.event(
// scrollX = e.nativeEvent.contentOffset.x
[{
nativeEvent: {
contentOffset: {
x: scrollX
}
}
}]
)
}
Reference
Methods
decay()
static decay(value, config)
将一个value基于衰减系数从初始速度动画到0
config是一个下列options的对象:
-
velocity
: 初始速度, Required -
deceleration
: 衰减率,默认 0.997 -
isInteraction
: 是否这个动画在InteractionManager
中创建一个 'interaction handle',默认是 true -
useNativeDriver
: 使用原生driver 默认是false
timing()
static timing(value, config)
随着easing曲线改变动画值。Easing
模块有很多预定义的曲线,你也可以自定义函数。
config也是一个对象:
-
duration
: 动画时间,默认为500 (ms) -
easing
: 缓动函数,默认是Easing.inOut(Easing.ease)
-
delay
: 开始动画前的延迟,默认是0 -
isInteraction
: 是否这个动画在InteractionManager
中创建一个 'interaction handle',默认是 true -
useNativeDriver
: 使用原生driver 默认是false
spring()
static spring(value, config)
根据一种基于阻尼谐振的分析弹簧模型,对其进行赋值。
主要使用方法:
Animated.spring(value: Animated.Value | Animated.ValueXY, config: SpringAnimationConfig): Animated.CompositeAnimation
其中 config
有如下选项:
-
friction
: 控制反弹力或者超过部分,默认值是 7 -
tension
: 控制速度,默认是40
-
speed
: 控制动画的速度,默认值是12
-
bounciness
: 控制反弹力,默认值是8
指定 刚度/阻尼/质量(sniffness/damping/mass
) 传入 Animated.spring
函数config中,将使动画采用基于阻尼谐振子运动方程的解析弹簧模型
-
stiffness
: 弹簧刚度系数,默认值是100
-
damping
: 定义弹簧的运动是如何因摩擦力(frication
)而阻尼的,默认值是10
-
mass
: 附着在弹簧末端的物体质量,默认值是1
注意你只能定义其中的一组数据,例如定义了 '反弹力和速度', 其余的2组则不能再定义了:
-
bounciness/speed
: 反弹力和速度 -
tension/friction
:张力和摩擦力 -
stiffness/damping/mass
:刚度,阻尼和质量
其余的配置选项:
-
velocity
: 附着在弹簧末端物体的初始速度,默认值是0,即物体没有运动 -
overshootClamping
: 表示弹簧是否应该是压缩状态而非舒展状态,默认值是false -
restDisplacementThreshold
: 在静止时(at rest)位移阈值,默认值是 0.001 -
restSpeedThreshold
: 静止时应考虑弹簧的速度,单位为pixel/second
, 默认值是 0.001 -
delay
: 动画开始前延迟时间,单位ms,默认值是0 -
isInteraction
: 是否这个动画在InteractionManager
上创建一个 'interaction handle',默认是true -
useNativeDriver
: 是否使用原生驱动,默认false
add()
static add(a, b)
将2个动画值加在一起组合创建一个新的动画值
divide()
static divide(a, b)
第1个动画值减去第2个动画值组合创建一个新的动画值
multiply()
static multiply(a, b)
将2个动画值相乘在一起组合创建一个新的动画值
modulo()
static modulo(a, modulus)
将动画值取模创建一个新的动画值
diffClamp()
static diffClamp(a, min, max)
在限制的2个值之间创建一个新的动画值。它使用了最后一个值之间的差值,因此,即使值远离界限,当值再次接近时,它也会开始改变。(value = clamp(value + diff, min, max)
).
这在scroll events中有用,比如,在向上滚动时显示navbar,在向下滚动时隐藏navbar
loop()
static loop(animation)
连续的循环一个给定的动画,因此每次到达最后之后再从头开始。能够通过 iterations
指定循环的次数。如果子动画设置了 useNativeDriver: true
将不会影响UI线程。另外,loops将阻止那些基于 VirtualizedList
的组件在动画运行时渲染更多的行,可以通过在子动画config中设置isInteraction: false
来修复这个问题
event()
static event(argMapping, config?)
接收映射数组,从每个arg依次的提取值,然后对映射的结果调用 setValue
方法
onScroll= {Animated.event(
[{nativeEvent: {contentOffset: {x: this._scrollX}}}],
{listener: (event)=> console.log(event)} // 可选的异步listener
)}
...
onPanResponderMove: Animated.event([
null, // raw event arg ignored
{dx: this._panX}], // gestureState arg
{listener: (event, gestureState) => console.log(event, gestureState)}, // Optional async listener
),
forkEvent()
static forkEvent(event, listener)
高级命令式API,用于监听传入props的动画事件。尽量直接使用values
unforkEvent()
static forkEvent(event, listener)
取消监听