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
We will start with creating a project and installing the required libraries.
Create the project
npx react-native init SharedTransition
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
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> ); }
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> ); }
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> ); }
Please note, Do not import Animated from react-native else this will not work.
Top comments (0)