Ứng dụng viết bằng ReactNative sử dụng thư viện react-native-navigation để điều hướng các màn hình. Thư viện này có tích hợp sẵn animation giúp chuyển đổi màn hình có hiệu ứng đẹp. Để thực hành demo, ứng dụng mới tạo cần có navigation https://reactnavigation.org/ và có 2 component screen.

Các bước thực hiện:

Bước 1: Sau khi có project, tiến hành cài thư viện navigation

npm install @react-navigation/native 
npm install react-native-screens react-native-safe-area-context
npm install @react-navigation/stack 
npm install --save react-native-gesture-handler

Xem chi tiết tại https://reactnavigation.org/docs/stack-navigator

Bước 2: Tạo component và code chuyển màn hình

Trong phần ví dụ này sẽ làm việc trên 1 file App.tsx


import { Button, StyleSheet, Text, View } from 'react-native'
import React from 'react'
import { createStackNavigator } from '@react-navigation/stack' // bỏ chữ Native
import { NavigationContainer } from '@react-navigation/native'


const Screen1 = (props)=>{
 return (
   <View style={{ flex:1, backgroundColor: 'yellow'}}>
     <Text>Screen 11111 </Text>
     <Button title='Sang màn 2'
     onPress={()=>props.navigation.navigate('Screen2')}/>
   </View>
 )
}
const Screen2 = ()=>{
 return (
   <View style={{ flex:1, backgroundColor: 'cyan'}}>
     <Text>Screen 2222 </Text>
   </View>
 )
}

const StackDemo = createStackNavigator(); 


const App = () => {
 return (
   <NavigationContainer>
     <StackDemo.Navigator initialRouteName='Screen1'
       screenOptions={ { headerShown: false}}
     >
       <StackDemo.Screen name='Screen1' component={Screen1} />
       <StackDemo.Screen name='Screen2' component={Screen2} />


     </StackDemo.Navigator>
   </NavigationContainer>
 )
}


export default App

const styles = StyleSheet.create({})

Bước 3: Chạy ứng dụng để kiểm tra việc chuyển đổi màn hình

Sử dụng lệnh:

npm start -- --reset-cache

Bước 4: Cải tiến ứng dụng thêm hiệu ứng

Sau khi chạy được ứng dụng thành công thì cải tiến thêm hiệu ứng chuyển màn hình

<StackDemo.Navigator initialRouteName='Screen1'
      screenOptions={ { headerShown: true,
       cardStyleInterpolator: ( {current, layouts }) => (
         {
           cardStyle:{
             // các thuộc tính hiệu ứng viết ở đây:
             opacity: current.progress,//thay đổi độ trong suốt theo quá trình hiển thị
             transform: [
               {
                  translateX: current.progress.interpolate({
                   inputRange:[0,1],
                   outputRange:[layouts.screen.width, 0]
                  })
               },
               {
                 scale: current.progress.interpolate({
                   inputRange:[0,1],
                   outputRange:[0.5,1]
                 })
               }
              
             ]
           }
         }
       )

      }}
    >

Chú ý không quên chạy lại lệnh như ở bước 3

 

Tham khảo thêm các hiệu ứng tại https://reactnavigation.org/docs/shared-element-transitions/