-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Expand file tree
/
Copy pathViewFlatteningScreen.tsx
More file actions
158 lines (142 loc) · 3.75 KB
/
ViewFlatteningScreen.tsx
File metadata and controls
158 lines (142 loc) · 3.75 KB
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import React from 'react';
import { Animated, StyleSheet, Text, View } from 'react-native';
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
import { COLORS } from './colors';
declare const performance: {
now: () => number;
};
function ParentViewFlattenedDemo() {
const tap = Gesture.Tap().onStart(() =>
console.log(performance.now(), 'tap!')
);
return (
<>
<Text>Parent view flattened</Text>
<View style={styles.borderedBox}>
<GestureDetector gesture={tap}>
<InnerFlattenedParent />
</GestureDetector>
</View>
</>
);
}
function InnerFlattenedParent() {
return (
<View style={[styles.boxWrapper]}>
{/* parent view will be collapsed */}
<View style={[styles.box, { backgroundColor: COLORS.NAVY }]} />
</View>
);
}
function ParentViewNotFlattenedCollapsableTrueDemo() {
const tap = Gesture.Tap().onStart(() => {
console.log(performance.now(), 'tap!');
});
return (
<>
<Text>Parent view not flattened, collapsable=true</Text>
<Text>(child moved to the same level as parent)</Text>
<View style={styles.borderedBox}>
<GestureDetector gesture={tap}>
<InnerNotFlattenedParentCollapsable />
</GestureDetector>
</View>
</>
);
}
function InnerNotFlattenedParentCollapsable() {
return (
<View style={[styles.boxWrapper, { backgroundColor: COLORS.KINDA_BLUE }]}>
<View style={[styles.box, { backgroundColor: COLORS.NAVY }]} />
</View>
);
}
function ParentViewNotFlattenedCollapsableFalseDemo() {
const tap = Gesture.Tap().onStart(() =>
console.log(performance.now(), 'tap!')
);
return (
<>
<Text>Parent view not flattened, collapsable=false</Text>
<Text>(structure doesn't change)</Text>
<View style={styles.borderedBox}>
<GestureDetector gesture={tap}>
<InnerNotFlattenedParentNotCollapsable />
</GestureDetector>
</View>
</>
);
}
function InnerNotFlattenedParentNotCollapsable() {
return (
<View
style={[styles.boxWrapper, { backgroundColor: COLORS.KINDA_BLUE }]}
collapsable={false}>
<View style={[styles.box, { backgroundColor: COLORS.NAVY }]} />
</View>
);
}
function ParentAnimatedViewDemo() {
const tap = Gesture.Tap().onStart(() =>
console.log(performance.now(), 'tap!')
);
return (
<>
<Text>Parent is Animated.View</Text>
<View style={styles.borderedBox}>
<GestureDetector gesture={tap}>
<InnerParentAnimatedView />
</GestureDetector>
</View>
</>
);
}
function InnerParentAnimatedView() {
return (
<Animated.View style={[styles.boxWrapper]}>
<View style={[styles.box, { backgroundColor: COLORS.NAVY }]} />
</Animated.View>
);
}
export default function ViewFlatteningScreen() {
return (
<View style={styles.container}>
<Text style={styles.bold}>
Fabric comes with a brand new advanced view flattening mechanism. Not
only some of the views may gets collapsed but also the structure of
native views hierarchy may differ from the React component tree.
</Text>
<ParentViewFlattenedDemo />
<ParentViewNotFlattenedCollapsableTrueDemo />
<ParentViewNotFlattenedCollapsableFalseDemo />
<ParentAnimatedViewDemo />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
bold: {
fontWeight: 'bold',
textAlign: 'center',
marginHorizontal: 5,
marginBottom: 10,
},
borderedBox: {
borderWidth: 2,
borderStyle: 'dashed',
borderColor: 'gray',
margin: 5,
},
boxWrapper: {
padding: 17,
margin: 15,
},
box: {
width: 25,
height: 25,
},
});