forked from race604/react-native-viewpager
-
Notifications
You must be signed in to change notification settings - Fork 2
/
DefaultViewPageIndicator.js
105 lines (91 loc) · 2.34 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
'use strict';
var React = require('react');
var ReactNative = require('react-native');
var {
Dimensions,
StyleSheet,
Text,
TouchableOpacity,
View,
Animated,
} = ReactNative;
var deviceWidth = Dimensions.get('window').width;
var DOT_SIZE = 6;
var DOT_SAPCE = 4;
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_SAPCE,
marginRight: DOT_SAPCE,
},
curDot: {
position: 'absolute',
width: DOT_SIZE,
height: DOT_SIZE,
borderRadius: DOT_SIZE / 2,
backgroundColor: '#80ACD0',
margin: DOT_SAPCE,
bottom: 0,
},
});
var DefaultViewPageIndicator = React.createClass({
propTypes: {
goToPage: React.PropTypes.func,
activePage: React.PropTypes.number,
pageCount: React.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_SAPCE * 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;