-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathApp.js
132 lines (125 loc) · 3 KB
/
App.js
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import {BlurView} from '@react-native-community/blur';
import React from 'react';
import {
SafeAreaView,
StyleSheet,
Text,
Image,
View,
Animated,
} from 'react-native';
import LinearGradient from 'react-native-linear-gradient';
import {PanGestureHandler, State} from 'react-native-gesture-handler';
const App = () => {
return (
<SafeAreaView>
<Image
style={styles.backgroundImage}
source={require('./assets/bkg.jpg')}
/>
<Image
style={styles.backgroundAbstractImage}
source={require('./assets/abstract.png')}
/>
<View style={styles.contentContainer}>
<DraggableBox>
<BlurView
blurType="light"
blurAmount={20}
style={styles.cardContainer}>
<LinearGradient
colors={['rgba(0,0,0,0.1)', 'rgba(0,0,0,0.2)']}
start={{x: 0, y: 1}}
end={{x: 1, y: 1}}
useAngle
angle={110}
style={styles.card}
/>
</BlurView>
</DraggableBox>
</View>
</SafeAreaView>
);
};
const DraggableBox = (props) => {
const _translateX = new Animated.Value(0);
const _translateY = new Animated.Value(0);
const _lastOffset = {x: 0, y: 0};
const _onGestureEvent = Animated.event(
[
{
nativeEvent: {
translationX: _translateX,
translationY: _translateY,
},
},
],
{
useNativeDriver: true,
},
);
const _onHandlerStateChange = (event) => {
if (event.nativeEvent.oldState === State.ACTIVE) {
_lastOffset.x += event.nativeEvent.translationX;
_lastOffset.y += event.nativeEvent.translationY;
_translateX.setOffset(_lastOffset.x);
_translateX.setValue(0);
_translateY.setOffset(_lastOffset.y);
_translateY.setValue(0);
}
};
return (
<PanGestureHandler
{...props}
onGestureEvent={_onGestureEvent}
onHandlerStateChange={_onHandlerStateChange}>
<Animated.View
style={[
styles.draggableBox,
{transform: [{translateX: _translateX}, {translateY: _translateY}]},
]}>
{props.children}
</Animated.View>
</PanGestureHandler>
);
};
const styles = StyleSheet.create({
backgroundImage: {
height: '100%',
width: undefined,
aspectRatio: 1,
zIndex: 1,
},
backgroundAbstractImage: {
position: 'absolute',
height: undefined,
width: '100%',
aspectRatio: 1,
zIndex: 5,
transform: [{translateY: 200}, {rotateZ: '-55deg'}, {scale: 1.5}],
},
contentContainer: {
display: 'flex',
height: '100%',
width: '100%',
position: 'absolute',
alignItems: 'center',
justifyContent: 'center',
},
cardContainer: {
width: 350,
height: 200,
},
card: {
height: '100%',
width: '100%',
borderColor: 'rgba(255,255,255,0.3)',
borderRadius: 20,
borderWidth: 2,
},
draggableBox: {
borderRadius: 20,
overflow: 'hidden',
},
});
export default App;