ReactXP unterstützt eine leistungsstarke Animationsabstraktion. Einzelne Stilelemente (z. B. Transformationen, Opazität oder Hintergrundfarbe) können animiert werden.
Vier grundlegende RX-Klassen können animierbare Stile haben
Animated.View
Animated.Image
Animated.Text
Animated.TextInput
Diese Komponententypen sollten anstelle der normalen View, Image, Text oder TextInput in der Render-Methode verwendet werden. Im Allgemeinen können Stileigenschaften, die als numerische Werte oder Farben ausgedrückt werden, animiert werden. Eigenschaften mit Textwerten (z. B. flexDirection oder fontWeight) können nicht animiert werden.
Das folgende Beispiel zeigt, wie animierte Werte mit einem Anfangswert erstellt werden. Animierte Werte werden typischerweise als Instanzvariablen innerhalb einer Komponentenkasse gespeichert. Sie können auch in der Zustandsstruktur gespeichert werden.
let animatedOpacityValue = RX.Animated.createValue(1.0);
let animatedScaleValue = RX.Animated.createValue(1.0);
Für animierte Farbwerte ist es möglich, interpolierte Werte zu erstellen, die von einem numerischen Bereich auf einen Farbbereich abgebildet werden. In diesem Beispiel wechselt der Wert sanft von Weiß zu Rot zu Schwarz, wenn der Wert von 0 auf 1 ansteigt.
let animatedColorValue = RX.Animated.createValue(0.0);
let interpolatedValue = RX.Animated.interpolate(animatedColorValue,
[0.0, 0.5, 1.0], ['white', 'red', 'black']);
Sobald ein animierter Wert erstellt ist, kann er mit einem animierten Stil verknüpft werden.
Einige animierte Stilwerte sind aufwendiger als andere. Einige beeinflussen das Layout von Elementen (z. B. Breite, Höhe, oben, links), sodass die Layout-Engine bei jeder Animationsphase aufgerufen werden muss. Es ist schneller, diese zu vermeiden und sich auf Stile zu beschränken, die das Layout nicht beeinflussen (z. B. Opazität und Transformationen).
Dieses Beispiel zeigt, wie ein Stylesheet mehrere animierte Werte enthalten kann.
let animatedStyle = RX.Styles.createAnimatedViewStyle({
opacity: animatedOpacityValue,
transform: [{
scale: animatedScaleValue
}]
});
Animierte Stylesheets können mit anderen statischen Stilen kombiniert werden.
render() {
<RX.Animated.View style={ [_styles.staticStyle, animatedStyle] } />
}
Um eine Animation zu beschreiben, geben Sie den Endwert des animierten Wertes und eine Dauer (in Millisekunden) an. Eine optionale Easing-Funktion ermöglicht eine Vielzahl von Animationskurven, einschließlich linearer, schrittweiser und kubischer Bézier-Kurven.
Sobald eine Animation definiert ist, startet ein Aufruf der start()-Methode die Animation. Die start-Methode nimmt einen optionalen Parameter entgegen, eine Callback-Funktion, die ausgeführt wird, wenn die Animation abgeschlossen ist.
let opacityAnimation = RX.Animated.timing(animatedScaleValue,
{ toValue: 0.0, duration: 250, easing: RX.Animated.Easing.InOut() }
);
opacityAnimation.start(() => this._doSomethingWhenAnimationCompletes());
Manchmal ist es nützlich, mehrere Animationen parallel oder sequenziell auszuführen. Dies wird einfach durch Aufrufen von RX.Animated.parallel() oder RX.Animated.sequence() erreicht. Komposit-Animationen können verschachtelt werden, um anspruchsvolle Sequenzen zu erstellen.
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();
Der Wert eines animierten Wertes kann direkt durch Aufrufen der Methode setValue gesetzt werden. Wenn diese Methode aufgerufen wird, während der Wert animiert wird, ist das Verhalten undefiniert. Das direkte Setzen des Wertes eines animierten Wertes ist schneller als die Verwendung eines nicht animierten Stilattributs und das erneute Rendern der Komponente mit einem neuen Attributwert.
let animatedOpacityValue = RX.Animated.createValue(1.0);
animatedOpacityValue.setValue(0.0);
ReactXP-Animations-APIs im Web werden mithilfe von DOM-Stilübergängen implementiert, im Gegensatz zur Verwendung von JavaScript-Code zur Steuerung der Animation. Dies führt zu einer wesentlich besseren Leistung und (in den meisten Fällen) fehlerfreien Animationen, schränkt jedoch die Verwendung der Animations-APIs ein.