DEV Community

Gaurav Rawat
Gaurav Rawat

Posted on

1

Shared Animation in React Native with Reanimated

Note: Before we begin, I would like to tell you that this feature is an experimental feature and is not yet recommended for production use.

Intro
We’ll be creating a simple shared animation between two screens.

A preview of what we will be doing in the tutorial

Shared Animation Preview

We will start with creating a project and installing the required libraries.

Create the project

npx react-native init SharedTransition

Enter fullscreen mode Exit fullscreen mode

Install the required libraries

yarn add react-native-reanimated
yarn add @react-navigation/native       
yarn add @react-navigation/native-stack  
yarn add react-native-screens            
yarn add react-native-safe-area-context 
Enter fullscreen mode Exit fullscreen mode

Note: Shared Element Transitions only work with the native stack navigator (react-native-screens).

Lets start with the coding part.

1) Create a file and write the navigation this will be your initial file.

import { NavigationContainer } from '@react-navigation/native'
import { createNativeStackNavigator } from '@react-navigation/native-stack'
import Home from './screens/Home'
import DetailScreen from './screens/DetailScreen'

const Stack = createNativeStackNavigator()

export default function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen name="Home" component={Home} />
        <Stack.Screen name="DetailScreen" component={DetailScreen} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

Enter fullscreen mode Exit fullscreen mode

As visible in our code, we have used Stack Navigator and added two components to the stack namely Home & DetailScreen.

2) Let's start working on the screens, We will start with Home

import React from 'react';
import {View, Button} from 'react-native';
import Animated from 'react-native-reanimated';

export default function Home({navigation}) {
  return (
    <View style={{flex: 1}}>
      <View style={{width: 150, height: 150}}>
        <Animated.Image
          source={{
            uri: 'https://fastly.picsum.photos/id/379/200/300.jpg?hmac=IEcRQyv-DIaRsldE8jIdMRW5IHCTyemefU-bbCJpY34',
          }}
          sharedTransitionTag="sharedTag"
          style={{width: 150, height: 150}}
        />
      </View>
      <Button
        title="Go to Details"
        onPress={() => navigation.navigate('DetailScreen')}
      />
    </View>
  );
}


Enter fullscreen mode Exit fullscreen mode

We created an Animated.View (from react-native-reanimated), and give it a sharedTransitionTag.
sharedTransitionTag is the prop used by the Reanimated library to connect elements between the screens.

3) Let's create DetailScreen where the user will be navigated to.

import React from 'react';
import {View, Button} from 'react-native';
import Animated from 'react-native-reanimated';

export default function DetailScreen({navigation}) {
  return (
    <View
      style={{
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
      }}>
      <View style={{width: 100, height: 100}}>
        <Animated.Image
          source={{
            uri: 'https://fastly.picsum.photos/id/379/200/300.jpg?hmac=IEcRQyv-DIaRsldE8jIdMRW5IHCTyemefU-bbCJpY34',
          }}
          sharedTransitionTag="sharedTag"
          style={{width: 100, height: 100}}
        />
      </View>
      <Button title="Go back" onPress={() => navigation.navigate('Home')} />
    </View>
  );
}

Enter fullscreen mode Exit fullscreen mode

Please note, Do not import Animated from react-native else this will not work.

Sentry mobile image

Improving mobile performance, from slow screens to app start time

Based on our experience working with thousands of mobile developer teams, we developed a mobile monitoring maturity curve.

Read more

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay