ReactXP 支持强大的动画抽象。可以为单个样式元素(例如变换、不透明度或 backgroundColor)制作动画。
四个基本的 RX 类可以有可动画样式
Animated.View
Animated.Image
Animated.Text
Animated.TextInput
这些组件类型应该在渲染方法中代替普通的 View、Image、Text 或 TextInput 使用。通常,以数值或颜色表示的样式属性可以动画化。具有文本值(例如 flexDirection 或 fontWeight)的属性无法动画化。
以下示例展示了如何创建具有初始值的动画值。动画值通常作为实例变量存储在组件类中。它们也可以存储在状态结构中。
let animatedOpacityValue = RX.Animated.createValue(1.0);
let animatedScaleValue = RX.Animated.createValue(1.0);
对于动画颜色值,可以创建从数字范围映射到颜色范围的插值值。在此示例中,当值从 0 增加到 1 时,颜色值从白色平滑过渡到红色再到黑色。
let animatedColorValue = RX.Animated.createValue(0.0);
let interpolatedValue = RX.Animated.interpolate(animatedColorValue,
[0.0, 0.5, 1.0], ['white', 'red', 'black']);
一旦创建了动画值,它就可以与动画样式关联。
某些动画样式值的开销比其他值高。有些会影响元素的布局(例如 width、height、top、left),因此在动画的每个阶段都需要调用布局引擎。避免这些并坚持使用不影响布局的样式(例如 opacity 和 transforms)会更快。
此示例演示了样式表如何包含多个动画值。
let animatedStyle = RX.Styles.createAnimatedViewStyle({
opacity: animatedOpacityValue,
transform: [{
scale: animatedScaleValue
}]
});
动画样式表可以与其他静态样式结合使用。
render() {
<RX.Animated.View style={ [_styles.staticStyle, animatedStyle] } />
}
要描述一个动画,请指定动画值的最终值和持续时间(以毫秒为单位)。可选的缓动函数允许各种动画曲线,包括线性、步进和三次贝塞尔曲线。
动画定义后,调用 start() 方法即可开始动画。start 方法接受一个可选参数,即动画完成时执行的回调。
let opacityAnimation = RX.Animated.timing(animatedScaleValue,
{ toValue: 0.0, duration: 250, easing: RX.Animated.Easing.InOut() }
);
opacityAnimation.start(() => this._doSomethingWhenAnimationCompletes());
有时并行或按顺序执行多个动画会很有用。这可以通过调用 RX.Animated.parallel() 或 RX.Animated.sequence() 轻松实现。复合动画可以嵌套以创建复杂的序列。
let compositeAnimation = RX.Animated.parallel([
RX.Animated.timing(animatedScaleValue,
{ toValue: 0.0, duration: 250, easing: RX.Animated.Easing.InOut() }
),
RX.Animated.timing(animatedOpacityValue,
{ toValue: 1.1, duration: 250, easing: RX.Animated.Easing.Linear() }
)
]);
compositeAnimation.start();
可以通过调用 setValue
方法直接设置动画值。如果在动画值正在动画化时调用此方法,则行为未定义。直接设置动画值比使用非动画样式属性并使用新属性值重新渲染组件要快。
let animatedOpacityValue = RX.Animated.createValue(1.0);
animatedOpacityValue.setValue(0.0);
ReactXP 在 Web 上的动画 API 是使用 DOM 样式转换实现的,而不是使用 JavaScript 代码驱动动画。这带来了更好的性能,并且(在大多数情况下)无故障动画,但也对动画 API 的使用施加了一些限制。