import React, { useRef } from 'react';
import { Animated, ScrollView, View, Text, Image, StyleSheet, Dimensions } from 'react-native';
const HEADER_HEIGHT = 200;
const SCREEN_WIDTH = Dimensions.get('window').width;
export default function ParallaxScrollScreen() {
const scrollY = useRef(new Animated.Value(0)).current;
const headerTranslate = scrollY.interpolate({
inputRange: [0, HEADER_HEIGHT],
outputRange: [0, -HEADER_HEIGHT / 2],
extrapolate: 'clamp'
});
return (
<View style={styles.container}>
<Animated.ScrollView
contentContainerStyle={{ paddingTop: HEADER_HEIGHT }}
scrollEventThrottle={16}
onScroll={Animated.event(
[{ nativeEvent: { contentOffset: { y: scrollY } } }],
{ useNativeDriver: true }
)}
>
<View style={styles.content}>
{[...Array(15).keys()].map(i => (
<Text key={i} style={styles.itemText}>Item {i + 1}</Text>
))}
</View>
</Animated.ScrollView>
<Animated.View
style={[
styles.header,
{ transform: [{ translateY: headerTranslate }] }
]}
>
<Image
source={{ uri: 'https://reactnative.dev/img/tiny_logo.png' }}
style={styles.headerImage}
resizeMode="cover"
accessible={true}
accessibilityLabel="Header image with parallax effect"
/>
</Animated.View>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1
},
header: {
position: 'absolute',
top: 0,
width: SCREEN_WIDTH,
height: HEADER_HEIGHT,
overflow: 'hidden',
zIndex: 1
},
headerImage: {
width: '100%',
height: HEADER_HEIGHT
},
content: {
backgroundColor: '#fff',
paddingHorizontal: 16
},
itemText: {
fontSize: 18,
paddingVertical: 12,
borderBottomWidth: 1,
borderBottomColor: '#ccc'
}
});We use React Native's Animated API to create a smooth parallax effect. The scrollY animated value tracks the vertical scroll position. We interpolate this value to move the header image upwards but at half the speed of the scroll, creating the parallax effect.
The header image is positioned absolutely at the top, behind the scroll content. The scroll content has padding at the top equal to the header height so the list items start below the image.
This approach keeps the UI smooth and responsive, and the image moves slower than the content, which is the essence of parallax scrolling.