fbpx

React native Apple App of the day Animation #3 : Close animation

React native Apple App of the day Animation #3 : Close animation

This tutorial is the third part of our implementation of the Apple app of the day Animation in React native. Therefore, it is suggested to go through part one and two of this tutorial series in order to get the full insight into the app and make ourself comfortable with all the implementations. In the second part of this tutorial, we successfully implemented the enlarge-image animation when we click or press on any image. Here, we are going to add the text section to the enlarged pop-up animation and also close the animation.

The idea is to first complete the text section for the enlarged part and then implement the close animation of the enlarged image with content.

So, let us begin!

Adding Content Description

In the second part of the tutorial, we created two View components. One with flex value 2 and one with flex value as 1. In the upper View, we added the copied image which appears with enlarging animation when clicked. Now, we work on the second View component in order to add the content section.

First, we need to define an animation variable initialized to Animated value as 0 as shown in the code snippet below:

constructor(props) {
    super(props);
    .....
    this.animation = new Animated.Value(0);
    this.state = {
      activeImage: null,
    };
  }

Adding content and styles

In this step, we are going to add some content to the second View component by using the Text component and then add some styles to the View as well as the Text component. Then, we need to change the normal View component to the Animated View component. The code and styles required to implement this are provided in the code snippet below:

<Animated.View style={{ flex: 1,  backgroundColor: 'white', padding: 20, paddingTop: 50 }}>
            <Text style={{ fontSize: 24, paddingBottom: 10 }}>Very Sure Developer</Text>
            <Text>Eiusmod consectetur cupidatat dolor Lorem excepteur excepteur. Nostrud sint officia consectetur eu pariatur laboris est velit. Laborum non cupidatat qui ut sit dolore proident.</Text>
          </Animated.View>

Hence, we get the following result on the emulator screen as we click on any image:

Adding Animation

In this step, we are going to add the fade-in animation to the Text section. The idea is make the text section appear from the bottom as fading in. In order to do this, we need to defined two animation styles which are opacity and translateYwhich will help to solve this animation effect. In order to configure animation, we are going to use interpolate method initialized to animatedContentY constant that takes an object with two properties: inputRange and outputRange as shown in the code snippet below:

const animatedContentY = this.animation.interpolate({
      inputRange: [0, 1],
      outputRange: [-150, 0]
    })

To understand how the inputRange and outputRange work, let’s match the value from two properties as shown below:

  • 0 and -150 where 0 = 0% means that animation does not start when position set to -150.
  • 1 and 0 where 1 = 100% mean animation to finish and position will go back to original.

Next, we also initialize the interpolate method to animatedContentOpacity constant for the opacity effect as shown in the code snippet below:

const animatedContentOpacity = this.animation.interpolate({
    inputRange: [0, 0.5, 1],
    outputRange: [0, 1, 1]
  })

Here, we want to display 100%  opacity when animation reaches 50% so that the inputRange and outputRange work like a charm.

Now, we need to finish this section by adding both of animatedContentY and animatedContentOpacity constant to animatedContentStyle constant as an object. The animatedContentStyle constant is defined as an object which takes two animation values which are opacity and transform. The opacity is initialized to animatedContentOpacity and transform is initialized to an array of object with translateY value as animatedContentY as shown in the code snippet below:

const animatedContentStyle = {
      opacity: animatedContentOpacity,
      transform: [
        {
          translateY: animatedContentY,
        },
      ],
    };

Now, we need to add the animatedContentStyle constant to the style prop array as shown in the code snippet below:

<Animated.View
            style={[
              {
                flex: 1,
                backgroundColor: 'white',
                padding: 20,
                paddingTop: 50,
              },
              animatedContentStyle,
            ]}>
            <Text style={{fontSize: 24, paddingBottom: 10}}>
              Very Sure Developer
            </Text>
            <Text>
              Eiusmod consectetur cupidatat dolor Lorem excepteur excepteur.
              Nostrud sint officia consectetur eu pariatur laboris est velit.
              Laborum non cupidatat qui ut sit dolore proident.
            </Text>
 </Animated.View>

Lastly, we need to activate the animation in openImage function that we defined in the previous part. The animation variable is provided as a parameter to timing function of Animated component with toValue as 1 and duration of 300ms as shown in the code snippet below:

Animated.parallel([
           ...........
           Animated.timing(this.animation, {
             toValue: 1,
             duration: 300,
           }),
         ]).start();

Hence, we get the following result in our emulator screen:

Finish Closing Animation

The last thing we need to add is the close animation to our pop-up enlarged image element. In order to do this, we need to define a new function named closeImage. The closeImage function is configured with all the Animated properties that are required to close the image element as shown in the code snippet below:

closeImage = () => {
   Animated.parallel([
     Animated.timing(this.position.x, {
       toValue: this.oldPosition.x,
       duration: 300
     }),
     Animated.timing(this.position.y, {
       toValue: this.oldPosition.y,
       duration: 250
     }),
     Animated.timing(this.dimensions.x, {
       toValue: this.oldPosition.width,
       duration: 250
     }),
     Animated.timing(this.dimensions.y, {
       toValue: this.oldPosition.height,
       duration: 250
     }),
     Animated.timing(this.animation, {
       toValue: 0,
       duration: 250
     })
   ]).start(() => {
     this.setState({
       activeImage: null
     })
   })
 }

The idea of the implementation of closeImage function is to add the same animation properties from openImage function that we defined in the last tutorial. And then, we rewind the animation positions to the original positions by using the value that we stored in the oldPosition variable. Then, when the animation starts, we need to set the activeImage state to null.

Finally, we need to add the close button(X) to trigger the closeImage function. In order to implement the close button, we put a letter “X” inside of Text component wrapped by the Animated View component. Then, we need to add the TouchableWithoutFeedback component wrapping the Animated View component in order to make the text clickable. Lastly, we add the closeImage function to the onPress event of the TouchableWithoutFeedback component. Then, we need to bind those components with some styles to make it appear at the top right corner. The code and the styles required to implement the close button is provided in the code snippet below:

<TouchableWithoutFeedback onPress={() => this.closeImage()}>
              <Animated.View style={{ position: 'absolute', top: 30, right: 30 }}>
                <Text style={{ fontSize: 24, fontWeight: 'bold', color: 'white' }}>X</Text>
              </Animated.View>
</TouchableWithoutFeedback>

Hence, we get the following result in our emulator screen:

Now, we test the same thing with other images as well and the result is shown in the emulator simulation below:

Hence, we have successfully added the text section as well as implemented the close animation in our React Native app.

 

Conclusion

This tutorial is a third of part of our implementation of the Apple app of the day example on React Native. In this part of the tutorial, we learned how to add text and configure different animation properties. We also learned how to bind different styles to the components. Then, we finally implemented the close animation to our pop-up enlarged image element from the previous tutorial.

I am very grateful to Nathavarun from UnsureProgrammer for this great and interesting tutorial.

If you like this tutorial please leave feedback on the comment section and do not forget to share!

Credit

The content is acquired from the #3 Apple App of the day Animation by Unsureprogrammer.

And the image is acquired from Unsplash.

 

Krissnawat Kaewsanmuang

Fullstack Javascript developer from beautiful Chiangmai, love Americano and travel so much

One thought on “React native Apple App of the day Animation #3 : Close animation

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.