For React Native, when you want to create an animation, the Animated API is the most effective way.
There are three main methods that you will use to create animations
Animated.timing()
– Connects time intervals to linear valuesAnimated.decay()
– Start with a certain acceleration after the puzzle decreases until it stops.Animated.spring()
– A simplesingle-spring
physical model based on Rebound and Origami . Check the acceleration state to create a floating motion when thetoValue
value is updated and can be connected.
We will learn about Animated.timing()
and Animated.spring()
as they are most popular.
Along with the above three methods, there are three ways to call these animations. We will learn all three.
Animated.parallel()
– Start with an array of animations all at once.Animated.sequence()
– Start with an array of animations in order, waiting for one to finish. If the current animation is stopped, no animation will start.Animated.stagger()
– Similar toAnimated.parallel()
but allows us to add delay between animations.
1. Animated.timing ()
The first animation we will create is this rotating animation using Animated.timing()
.
1 2 3 4 5 6 7 8 9 10 | Animated <span class="token punctuation">.</span> <span class="token function">timing</span> <span class="token punctuation">(</span> someValue <span class="token punctuation">,</span> <span class="token punctuation">{</span> toValue <span class="token punctuation">:</span> number <span class="token punctuation">,</span> duration <span class="token punctuation">:</span> number <span class="token punctuation">,</span> easing <span class="token punctuation">:</span> easingFunction <span class="token punctuation">,</span> delay <span class="token punctuation">:</span> number <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
This kind of permanent animation is well suited to creating loading icons. To get started naturally we need to create a React Native project.
1 2 3 | react <span class="token operator">-</span> native init animations cd animations |
In this folder, open the index.android.js
or index.ios.js
file
Now that we have a new project created, the first thing we need to do is import Animated
, Image
and Easing
into:
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">import</span> <span class="token punctuation">{</span> AppRegistry <span class="token punctuation">,</span> StyleSheet <span class="token punctuation">,</span> Text <span class="token punctuation">,</span> View <span class="token punctuation">,</span> Animated <span class="token punctuation">,</span> Image <span class="token punctuation">,</span> Easing <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react-native'</span> |
Animated
is the library we need to create animations.
Image
required to create image in UI
Easing
is a module that allows us to create linear forms such as linear, ease, quad, cubic, sin. elastic, bounce, back, benzier, in, out, inout
and more. Here we will use linear
.
Next, we need to set an initial value for the rotation value:
1 2 3 4 5 | <span class="token function">constructor</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">super</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> spinValue <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Animated <span class="token punctuation">.</span> Value</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
We set spinValue
the new value of Animated.Value
and pass 0.
Next we need to create a spin function and call this function in componentDidMount
to let it run at app load.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token function">componentDidMount</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> <span class="token function">spin</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">spin</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> spinValue <span class="token punctuation">.</span> <span class="token function">setValue</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> Animated <span class="token punctuation">.</span> <span class="token function">timing</span> <span class="token punctuation">(</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> spinValue <span class="token punctuation">,</span> <span class="token punctuation">{</span> toValue <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> duration <span class="token punctuation">:</span> <span class="token number">4000</span> <span class="token punctuation">,</span> easing <span class="token punctuation">:</span> Easing <span class="token punctuation">.</span> linear <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">start</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token keyword">this</span> <span class="token punctuation">.</span> <span class="token function">spin</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
The spin()
function will do the following:
- Set
this.spinValue
to 0 - Call
Animated.timing
and setthis.spinValue
to 1 of about 4000 milliseconds with linear easing. - Call
start()
in the following method and putthis.spin()
into the callback to call the eternal loop.
Next we need to render it:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token function">render</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> spin <span class="token operator">=</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> spinValue <span class="token punctuation">.</span> <span class="token function">interpolate</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> inputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> outputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'0deg'</span> <span class="token punctuation">,</span> <span class="token string">'360deg'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> View style <span class="token operator">=</span> <span class="token punctuation">{</span> styles <span class="token punctuation">.</span> container <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator"><</span> Animated <span class="token punctuation">.</span> Image style <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> width <span class="token punctuation">:</span> <span class="token number">227</span> <span class="token punctuation">,</span> height <span class="token punctuation">:</span> <span class="token number">200</span> <span class="token punctuation">,</span> transform <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> rotate <span class="token punctuation">:</span> spin <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> source <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> uri <span class="token punctuation">:</span> <span class="token string">'https://s3.amazonaws.com/media-p.slid.es/uploads/alexanderfarennikov/images/1198519/reactjs.png'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> View <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Finally, the style component in the middle.
1 2 3 4 5 6 7 8 | <span class="token keyword">const</span> styles <span class="token operator">=</span> StyleSheet <span class="token punctuation">.</span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> container <span class="token punctuation">:</span> <span class="token punctuation">{</span> flex <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> justifyContent <span class="token punctuation">:</span> <span class="token string">'center'</span> <span class="token punctuation">,</span> alignItems <span class="token punctuation">:</span> <span class="token string">'center'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
2. A few more examples of Animated.timing
Now that we know the basics of Animated.timing
, let’s look at a few more examples of interpolate
( interpolate
values) and create them.
In the next example, we will create single animation values, and use them to create multiple animations in the following styles:
- marginLeft
- opacity
- fontSize
- rotateX
The first thing that we still have to do is create initialization value.
1 2 3 4 5 | <span class="token function">constructor</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">super</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> animatedValue <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Animated <span class="token punctuation">.</span> Value</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Then create animation function in componentDidMount()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token function">componentDidMount</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> <span class="token function">animate</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token function">animate</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> animatedValue <span class="token punctuation">.</span> <span class="token function">setValue</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> Animated <span class="token punctuation">.</span> <span class="token function">timing</span> <span class="token punctuation">(</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> animatedValue <span class="token punctuation">,</span> <span class="token punctuation">{</span> toValue <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> duration <span class="token punctuation">:</span> <span class="token number">2000</span> <span class="token punctuation">,</span> easing <span class="token punctuation">:</span> Easing <span class="token punctuation">.</span> linear <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">start</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token keyword">this</span> <span class="token punctuation">.</span> <span class="token function">animate</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
In the render function, we create 5 different interpolation values:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token function">render</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> marginLeft <span class="token operator">=</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> animatedValue <span class="token punctuation">.</span> <span class="token function">interpolate</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> inputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> outputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token number">300</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> opacity <span class="token operator">=</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> animatedValue <span class="token punctuation">.</span> <span class="token function">interpolate</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> inputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token number">0.5</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> outputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> movingMargin <span class="token operator">=</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> animatedValue <span class="token punctuation">.</span> <span class="token function">interpolate</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> inputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token number">0.5</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> outputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token number">300</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> textSize <span class="token operator">=</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> animatedValue <span class="token punctuation">.</span> <span class="token function">interpolate</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> inputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token number">0.5</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> outputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">18</span> <span class="token punctuation">,</span> <span class="token number">32</span> <span class="token punctuation">,</span> <span class="token number">18</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token keyword">const</span> rotateX <span class="token operator">=</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> animatedValue <span class="token punctuation">.</span> <span class="token function">interpolate</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> inputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token number">0.5</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> outputRange <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'0deg'</span> <span class="token punctuation">,</span> <span class="token string">'180deg'</span> <span class="token punctuation">,</span> <span class="token string">'0deg'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token operator">...</span> <span class="token punctuation">}</span> |
Dog interpolate
allows us to use this.animatedValue
in many different ways. Because its value is only 0 to 1, we can change it to many different values for different styles like opacity, margin, text size, rotation.
Then we return the following:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> View style <span class="token operator">=</span> <span class="token punctuation">{</span> styles <span class="token punctuation">.</span> container <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator"><</span> Animated <span class="token punctuation">.</span> View style <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> marginLeft <span class="token punctuation">,</span> height <span class="token punctuation">:</span> <span class="token number">30</span> <span class="token punctuation">,</span> width <span class="token punctuation">:</span> <span class="token number">40</span> <span class="token punctuation">,</span> backgroundColor <span class="token punctuation">:</span> <span class="token string">'red'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> Animated <span class="token punctuation">.</span> View style <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> opacity <span class="token punctuation">,</span> marginTop <span class="token punctuation">:</span> <span class="token number">10</span> <span class="token punctuation">,</span> height <span class="token punctuation">:</span> <span class="token number">30</span> <span class="token punctuation">,</span> width <span class="token punctuation">:</span> <span class="token number">40</span> <span class="token punctuation">,</span> backgroundColor <span class="token punctuation">:</span> <span class="token string">'blue'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> Animated <span class="token punctuation">.</span> View style <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> marginLeft <span class="token punctuation">:</span> movingMargin <span class="token punctuation">,</span> marginTop <span class="token punctuation">:</span> <span class="token number">10</span> <span class="token punctuation">,</span> height <span class="token punctuation">:</span> <span class="token number">30</span> <span class="token punctuation">,</span> width <span class="token punctuation">:</span> <span class="token number">40</span> <span class="token punctuation">,</span> backgroundColor <span class="token punctuation">:</span> <span class="token string">'orange'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> Animated <span class="token punctuation">.</span> Text style <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> fontSize <span class="token punctuation">:</span> textSize <span class="token punctuation">,</span> marginTop <span class="token punctuation">:</span> <span class="token number">10</span> <span class="token punctuation">,</span> color <span class="token punctuation">:</span> <span class="token string">'green'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">></span> Animated Text <span class="token operator">!</span> <span class="token operator"><</span> <span class="token operator">/</span> Animated <span class="token punctuation">.</span> Text <span class="token operator">></span> <span class="token operator"><</span> Animated <span class="token punctuation">.</span> View style <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> transform <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> rotateX <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> marginTop <span class="token punctuation">:</span> <span class="token number">50</span> <span class="token punctuation">,</span> height <span class="token punctuation">:</span> <span class="token number">30</span> <span class="token punctuation">,</span> width <span class="token punctuation">:</span> <span class="token number">40</span> <span class="token punctuation">,</span> backgroundColor <span class="token punctuation">:</span> <span class="token string">'black'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator"><</span> Text style <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> color <span class="token punctuation">:</span> <span class="token string">'white'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">></span> Hello <span class="token keyword">from</span> TransformX <span class="token operator"><</span> <span class="token operator">/</span> Text <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> Animated <span class="token punctuation">.</span> View <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> View <span class="token operator">></span> <span class="token punctuation">)</span> |
Can add style
1 2 3 4 5 6 7 | <span class="token keyword">const</span> styles <span class="token operator">=</span> StyleSheet <span class="token punctuation">.</span> <span class="token function">create</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> container <span class="token punctuation">:</span> <span class="token punctuation">{</span> flex <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> paddingTop <span class="token punctuation">:</span> <span class="token number">150</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
Above is part 1 of the tutorial on creating animations, in the next section we will learn more ways to create more interesting animations.
REF: https://medium.com/react-native-training/react-native-animations-using-the-animated-api-ebe8e0669fae