The Animated library is designed to make animations fluid, powerful, and
-easy to build and maintain. Animated focuses on declarative relationships
-between inputs and outputs, with configurable transforms in between, and
-simple start/stop methods to control time-based animation execution.
The simplest workflow for creating an animation is to to create an
-Animated.Value, hook it up to one or more style attributes of an animated
-component, and then drive updates via animations using Animated.timing():
Animated.timing( this.state.fadeAnim, {
- toValue: 1, }
-).start();
Refer to the Animations guide to see
-additional examples of Animated in action.
Overview #
There are two value types you can use with Animated:
Animated.Value can bind to style properties or other props, and can be
-interpolated as well. A single Animated.Value can drive any number of
-properties.
Configuring animations #
Animated provides three types of animation types. Each animation type
-provides a particular animation curve that controls how your values animate
-from their initial value to the final value:
In most cases, you will be using timing(). By default, it uses a symmetric
-easeInOut curve that conveys the gradual acceleration of an object to full
-speed and concludes by gradually decelerating to a stop.
Working with animations #
Animations are started by calling start() on your animation. start()
-takes a completion callback that will be called when the animation is done.
-If the animation finished running normally, the completion callback will be
-invoked with {finished: true}. If the animation is done because stop()
-was called on it before it could finish (e.g. because it was interrupted by a
-gesture or another animation), then it will receive {finished: false}.
Using the native driver #
By using the native driver, we send everything about the animation to native
-before starting the animation, allowing native code to perform the animation
-on the UI thread without having to go through the bridge on every frame.
-Once the animation has started, the JS thread can be blocked without
-affecting the animation.
You can use the native driver by specifying useNativeDriver: true in your
-animation configuration. See the
-Animations guide to learn
-more.
Animatable components #
Only animatable components can be animated. These special components do the
-magic of binding the animated values to the properties, and do targeted
-native updates to avoid the cost of the react render and reconciliation
-process on every frame. They also handle cleanup on unmount so they are safe
-by default.
Animated exports the following animatable components using the above
-wrapper:
Animated.ImageAnimated.ScrollViewAnimated.TextAnimated.View
Composing animations #
Animations can also be combined in complex ways using composition functions:
Animations can also be chained together simply by setting the toValue of
-one animation to be another Animated.Value. See
-Tracking dynamic values in
-the Animations guide.
By default, if one animation is stopped or interrupted, then all other
-animations in the group are also stopped.
Combining animated values #
You can combine two animated values via addition, multiplication, division,
-or modulo to make a new animated value:
Interpolation #
The interpolate() function allows input ranges to map to different output
-ranges. By default, it will extrapolate the curve beyond the ranges given,
-but you can also have it clamp the output value. It uses lineal interpolation
-by default but also supports easing functions.
Read more about interpolation in the
-Animation guide.
Handling gestures and other events #
Gestures, like panning or scrolling, and other events can map directly to
-animated values using Animated.event(). This is done with a structured map
-syntax so that values can be extracted from complex event objects. The first
-level is an array to allow mapping across multiple args, and that array
-contains nested objects.
For example, when working with horizontal scrolling gestures, you would do
-the following in order to map event.nativeEvent.contentOffset.x to
-scrollX (an Animated.Value):
onScroll={Animated.event(
- [{ nativeEvent: {
- contentOffset: {
- x: scrollX
- }
- }
- }]
- )}