-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCollapsibleHeaderScrollView.tsx
103 lines (92 loc) · 2 KB
/
CollapsibleHeaderScrollView.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import React, { FC } from 'react';
import { View, Animated, StyleSheet, ImageSourcePropType } from 'react-native';
interface IProps {
image: ImageSourcePropType;
title: string;
}
const CollapsibleHeaderScrollView: FC<IProps> = ({
title,
image,
children,
}) => {
const scrollY = new Animated.Value(0);
const onScroll = Animated.event(
[{ nativeEvent: { contentOffset: { y: scrollY } } }],
{ useNativeDriver: true },
);
const transform = [
{
translateY: scrollY.interpolate({
inputRange: [0, 250],
outputRange: [0, 125],
}),
},
];
const imageAnimatedStyle = {
transform,
};
const textAnimatedStyle = {
transform,
opacity: scrollY.interpolate({
inputRange: [0, 120, 150],
outputRange: [1, 0.9, 0],
}),
};
const renderText = () => (
<View style={styles.textWrapper}>
<Animated.Text style={[styles.text, textAnimatedStyle]}>
{title}
</Animated.Text>
</View>
);
const renderHeader = () => {
return (
<View style={styles.header}>
<Animated.Image
source={image}
style={[styles.image, imageAnimatedStyle]}
resizeMode="cover"
/>
<View style={styles.overlay} />
{renderText()}
</View>
);
};
return (
<Animated.ScrollView
onScroll={onScroll}
scrollEventThrottle={20}
bounces={false}
>
{renderHeader()}
{children}
</Animated.ScrollView>
);
};
const styles = StyleSheet.create({
textWrapper: {
...StyleSheet.absoluteFillObject,
justifyContent: 'center',
alignItems: 'center',
},
text: {
color: 'white',
paddingHorizontal: 30,
fontSize: 40,
fontWeight: 'bold',
textAlign: 'center',
},
header: {
height: 250,
overflow: 'hidden',
},
image: {
width: '100%',
height: '100%',
},
overlay: {
...StyleSheet.absoluteFillObject,
backgroundColor: 'rgba(0, 0, 0, 0.4)',
},
});
export default CollapsibleHeaderScrollView;