Creating a Stunning Parallax Effect in React Native with React Native Reanimated

·

4 min read

In this comprehensive guide, we'll walk you through the process of creating an impressive parallax effect in a React Native application using the powerful animation library, React Native Reanimated. Parallax effects add depth and interactivity to your app's user interface, making it visually appealing and engaging for your users.

Prerequisites

Before we delve into the code, ensure that you have the following prerequisites in place:

  • Node.js and npm or yarn: Ensure that Node.js and npm (Node Package Manager) or yarn are installed on your system. You'll need them to manage dependencies and run your React Native project.

  • React Native Project: Set up a React Native project if you haven't already. You can create a new project using the React Native CLI.

Installing React Native Reanimated

To implement our parallax effect, we'll leverage the React Native Reanimated library. If you haven't already installed it, you can easily do so using npm or yarn by following the setup instructions here.

Now that we have our project set up and React Native Reanimated installed, let's dive into the code.

Getting Started

In this example, we'll build a simple image slider with a captivating parallax effect. We'll start by setting up a list of images and then use React Native Reanimated to add the parallax animation as the user swipes through them.

App.tsx

import React from 'react';
import { StyleSheet, View } from 'react-native';
import Slider from './src/components/Slider';
import Animated, { useAnimatedScrollHandler, useSharedValue } from 'react-native-reanimated';

const DATA = [
  // List of images here...
];

const App = () => {
  const scrollX = useSharedValue(0);
  const scrollHandler = useAnimatedScrollHandler({
    onScroll: event => {
      scrollX.value = event.contentOffset.x;
    },
  });

  return (
    <View style={styles.container}>
      <Animated.FlatList
        data={DATA}
        horizontal
        // ... other FlatList props ...
        renderItem={({ item, index }) => (
          <Slider item={item} index={index} scrollX={scrollX} />
        )}
        onScroll={scrollHandler}
      />
    </View>
  );
};

// ... Styles ...

export default App;

In the App.tsx file, we've set up a Simple FlatList to display our list of images. We utilize React Native Reanimated useSharedValue to create a shared animated value scrollX, which will track the scroll position of our FlatList.

Slider.tsx

import React from 'react';
import { StyleSheet, Dimensions } from 'react-native';
import Animated, { SharedValue, interpolate, useAnimatedStyle } from 'react-native-reanimated';

// ... Constants for image dimensions ...

const Slider: React.FC<SliderProps> = ({ item, index, scrollX }) => {
  const animatedStyle = useAnimatedStyle(() => {
    const inputRange = [
      (index - 1) * SCREEN_WIDTH,   // Previous item's position
      index * SCREEN_WIDTH,         // Current item's position
      (index + 1) * SCREEN_WIDTH,   // Next item's position
    ];
    const translateX = interpolate(scrollX.value, inputRange, [
      -SCREEN_WIDTH * 0.7,         // How much to move to the left
      0,                            // No movement
      SCREEN_WIDTH * 0.7,          // How much to move to the right
    ]);
    return {
      transform: [{ translateX }],
    };
  });

  return (
    <Animated.View style={[styles.container]}>
      <Animated.Image
        source={{ uri: item.url }}
        style={[styles.img, animatedStyle]}
      />
    </Animated.View>
  );
};

// ... Styles ...

export default Slider;

In the Slider.tsx file, we define the Slider component. Inside this component, we use useAnimatedStyle to create an animated style that calculates the translation based on the scrollX value. This translation is applied to the image, creating the mesmerizing parallax effect.
You can find the complete code for this project in our GitHub repository. Feel free to explore the code, experiment with different input and output ranges, and adapt it to your own projects.

Conclusion

With React Native Reanimated, you can easily create captivating and interactive UI effects like the parallax effect demonstrated in this guide. This example is a solid foundation for building more complex animations and interactions in your React Native applications.

Feel free to customize and extend this code to align with your project's unique requirements. Experiment with different input and output ranges to achieve distinctive animation effects. The possibilities are boundless, and React Native Reanimated empowers you to bring your creative ideas to life.

Armed with this knowledge, you're ready to craft stunning parallax effects that will elevate the user experience in your React Native apps. Happy coding!