-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathScreenStackHeaderConfigBackgroundColorExample.tsx
104 lines (96 loc) · 2.58 KB
/
ScreenStackHeaderConfigBackgroundColorExample.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
104
import Animated, {
useAnimatedProps,
useAnimatedStyle,
useSharedValue,
} from 'react-native-reanimated';
import type {
GestureUpdateEvent,
PanGestureChangeEventPayload,
} from 'react-native-gesture-handler';
import {
Gesture,
GestureDetector,
GestureHandlerRootView,
} from 'react-native-gesture-handler';
import {
Screen,
ScreenStack,
ScreenStackHeaderConfig,
} from 'react-native-screens';
import { Platform, StyleSheet, View } from 'react-native';
import React from 'react';
const AnimatedScreenStackHeaderConfig = Animated.createAnimatedComponent(
Platform.OS === 'web'
? React.forwardRef(ScreenStackHeaderConfig as any)
: ScreenStackHeaderConfig
);
Animated.addWhitelistedNativeProps({ title: true });
export default function ScreenStackHeaderConfigBackgroundColorExample() {
const isPressed = useSharedValue(false);
const offset = useSharedValue({ x: 0, y: 0 });
const gesture = Gesture.Pan()
.minDistance(0)
.onBegin(() => {
'worklet';
isPressed.value = true;
})
.onChange((e: GestureUpdateEvent<PanGestureChangeEventPayload>) => {
'worklet';
offset.value = {
x: e.changeX + offset.value.x,
y: e.changeY + offset.value.y,
};
})
.onFinalize(() => {
'worklet';
isPressed.value = false;
});
const animatedStyles = useAnimatedStyle(() => {
return {
transform: [
{ translateX: offset.value.x },
{ translateY: offset.value.y },
],
backgroundColor: isPressed.value ? 'gray' : 'black',
};
});
const animatedProps = useAnimatedProps(() => {
const h = Math.max(0, Math.min(360, Math.round(180 + offset.value.x)));
const l = Math.max(0, Math.min(100, Math.round(50 - offset.value.y / 5)));
const color = `hsl(${h}, 100%, ${l}%)`;
return {
backgroundColor: color,
title: color,
};
}, [offset]);
return (
<GestureHandlerRootView style={styles.root}>
<ScreenStack style={styles.container}>
<Screen>
<AnimatedScreenStackHeaderConfig animatedProps={animatedProps} />
<View style={styles.container}>
<GestureDetector gesture={gesture}>
<Animated.View style={[styles.ball, animatedStyles]} />
</GestureDetector>
</View>
</Screen>
</ScreenStack>
</GestureHandlerRootView>
);
}
const styles = StyleSheet.create({
root: {
flex: 1,
},
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
ball: {
width: 60,
height: 60,
borderRadius: 30,
backgroundColor: 'black',
},
});