forked from race604/react-native-viewpager
-
Notifications
You must be signed in to change notification settings - Fork 0
/
DefaultViewPageIndicator.js
114 lines (101 loc) · 2.45 KB
/
DefaultViewPageIndicator.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
"use strict";
var React = require("react");
var ReactNative = require("react-native");
var PropTypes = require("prop-types");
var createReactClass = require("create-react-class");
var {
Dimensions,
StyleSheet,
Text,
TouchableOpacity,
View,
Animated,
} = ReactNative;
var deviceWidth = Dimensions.get("window").width;
var DOT_SIZE = 8;
var DOT_SPACE = 5;
var styles = StyleSheet.create({
tab: {
alignItems: "center",
},
tabs: {
flexDirection: "row",
alignItems: "center",
justifyContent: "center",
},
dot: {
width: DOT_SIZE,
height: DOT_SIZE,
borderRadius: DOT_SIZE / 2,
backgroundColor: "#E0E1E2",
marginLeft: DOT_SPACE,
marginRight: DOT_SPACE,
},
curDot: {
position: "absolute",
width: DOT_SIZE,
height: DOT_SIZE,
borderRadius: DOT_SIZE / 2,
backgroundColor: "#009a44",
margin: DOT_SPACE,
},
});
var DefaultViewPageIndicator = createReactClass({
propTypes: {
goToPage: PropTypes.func,
activePage: PropTypes.number,
pageCount: PropTypes.number,
},
getInitialState() {
return {
viewWidth: 0,
};
},
renderIndicator(page) {
//var isTabActive = this.props.activePage === page;
return (
<TouchableOpacity
style={styles.tab}
key={"idc_" + page}
onPress={() => this.props.goToPage(page)}
>
<View style={styles.dot} />
</TouchableOpacity>
);
},
render() {
var pageCount = this.props.pageCount;
var itemWidth = DOT_SIZE + DOT_SPACE * 2;
var offset =
(this.state.viewWidth - itemWidth * pageCount) / 2 +
itemWidth * this.props.activePage;
//var left = offset;
var offsetX = itemWidth * (this.props.activePage - this.props.scrollOffset);
var left = this.props.scrollValue.interpolate({
inputRange: [0, 1],
outputRange: [offsetX, offsetX + itemWidth],
});
var indicators = [];
for (var i = 0; i < pageCount; i++) {
indicators.push(this.renderIndicator(i));
}
return (
<View
style={styles.tabs}
onLayout={event => {
var viewWidth = event.nativeEvent.layout.width;
if (!viewWidth || this.state.viewWidth === viewWidth) {
return;
}
this.setState({
viewWidth: viewWidth,
});
}}
>
{indicators}
<Animated.View style={[styles.curDot, { left }]} />
</View>
);
},
});
module.exports = DefaultViewPageIndicator;