1500+ ready React Native mobile app screens

Affiliates
Blog

How do I create a shared element transition in React Native?

Illustration depicting classical binary bit and quantum qubit states in superposition and binary.
Photo by Google DeepMind on Pexels

To create a shared element transition in React Native, use the react-navigation and react-native-shared-element libraries, which allow you to implement smooth transitions between screens with shared UI elements. Here’s a quick example.

What libraries do I need for shared element transitions?

You need react-navigation, react-native-shared-element, and their required dependencies for setting up shared element transitions in React Native. Here are the versions you should start with:

  • react-navigation: ^6.0.0
  • react-native-shared-element: ^0.14.0

How do I install the required libraries?

Install the libraries using npm or yarn. Run the following command:

npm install @react-navigation/native react-navigation react-native-shared-element

After installing, ensure you follow any additional setup instructions for react-navigation, including installing react-native-gesture-handler and react-native-reanimated as mentioned in their documentation.

How do I set up navigation using react-navigation?

Set up a basic navigator. Use a stack navigator if you haven’t already:

import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

const Stack = createStackNavigator();

function App() {
    return (
        <NavigationContainer>
            <Stack.Navigator>
                <Stack.Screen name="Home" component={HomeScreen} />
                <Stack.Screen name="Detail" component={DetailScreen} options={{ headerShown: false }} />
            </Stack.Navigator>
        </NavigationContainer>
    );
}

How do I use react-native-shared-element in my components?

In your component files, wrap the shared elements in SharedElement. For example, in your DetailScreen, use the SharedElement component like this:

import { SharedElement } from 'react-native-shared-element';

function DetailScreen({ route }) {
    const { item } = route.params;

    return (
        <View>
            <SharedElement id={`item.${item.id}.photo`}>
                <Image source={{ uri: item.photo }} style={{ width: '100%', height: 200 }} />
            </SharedElement>
            <Text>{item.title}</Text>
        </View>
    );
}

How do I define shared element transitions between screens?

Set up the sharedElements function in the DetailScreen and HomeScreen to establish what elements should transition between them:

function HomeScreen({ navigation }) {
    return (
        <FlatList
            data={data}
            keyExtractor={(item) => item.id}
            renderItem={({ item }) => (
                <TouchableOpacity
                    onPress={() => navigation.navigate('Detail', { item })}>
                    <SharedElement id={`item.${item.id}.photo`}>
                        <Image source={{ uri: item.photo }} style={{ width: 100, height: 100 }} />
                    </SharedElement>
                </TouchableOpacity>
            )}
        />
    );
}

How do I configure transitions in react-native-shared-element?

You can customize the transition by specifying the SharedElement prop transitionDuration. Here is how you can do this:

<SharedElement id={`item.${item.id}.photo`} style={{ resizeMode: "cover" }}>
    <Image source={{ uri: item.photo }} style={{ width: '100%', height: '80%' }} />
</SharedElement>

<SharedElement id={`item.${item.id}.title`} style={{ resizeMode: "cover" }}>
    <Text style={styles.title}>{item.title}</Text>
</SharedElement>

Also, add the transition duration in the navigation options:

<Stack.Screen
    name="Detail"
    component={DetailScreen}
    options={{
        transitionSpec: {
            open: { animation: 'timing', config: { duration: 300 }},
            close: { animation: 'timing', config: { duration: 300 }},
        },
    }}
/>

What are the common issues when using shared element transitions?

Common issues include missing IDs for shared elements or issues with styling that can impact performance on mid-range Android devices. Ensure each SharedElement has a unique ID and that layout styles are optimized to prevent glitches during transitions.

How can I test transitions in my app?

To test the shared element transitions, run your app in a simulator or on a real device. Ensure that your transitions look smooth, and check for any rendering issues in your animations on different devices, especially those with lower performance like mid-range Androids.

Where can I learn more about shared element transitions in React Native?

For deeper insights, refer to the documentation of the libraries used:

To implement shared element transitions in your own app, start by installing the required libraries, setting up your components, and defining transitions. Check out existing GitHub examples for real-world applications to enhance your implementation.