Skip to content

Commit c41054b

Browse files
committed
Use Animated for TabBar's too
1 parent 23825aa commit c41054b

File tree

2 files changed

+14
-22
lines changed

2 files changed

+14
-22
lines changed

DefaultTabBar.js

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@ var {
77
Text,
88
TouchableOpacity,
99
View,
10+
Animated,
1011
} = React;
1112

1213
var deviceWidth = Dimensions.get('window').width;
13-
var precomputeStyle = require('precomputeStyle');
14-
var TAB_UNDERLINE_REF = 'TAB_UNDERLINE';
1514

1615
var styles = StyleSheet.create({
1716
tab: {
@@ -52,12 +51,6 @@ var DefaultTabBar = React.createClass({
5251
);
5352
},
5453

55-
setAnimationValue(value) {
56-
this.refs[TAB_UNDERLINE_REF].setNativeProps(precomputeStyle({
57-
left: (deviceWidth * value) / this.props.tabs.length
58-
}));
59-
},
60-
6154
render() {
6255
var numberOfTabs = this.props.tabs.length;
6356
var tabUnderlineStyle = {
@@ -68,10 +61,14 @@ var DefaultTabBar = React.createClass({
6861
bottom: 0,
6962
};
7063

64+
var left = this.props.scrollValue.interpolate({
65+
inputRange: [0, 1], outputRange: [0, deviceWidth / numberOfTabs]
66+
});
67+
7168
return (
7269
<View style={styles.tabs}>
7370
{this.props.tabs.map((tab, i) => this.renderTabOption(tab, i))}
74-
<View style={tabUnderlineStyle} ref={TAB_UNDERLINE_REF} />
71+
<Animated.View style={[tabUnderlineStyle, {left}]} />
7572
</View>
7673
);
7774
},

index.js

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ var {
1212

1313
var DefaultTabBar = require('./DefaultTabBar');
1414
var deviceWidth = Dimensions.get('window').width;
15-
var TAB_BAR_REF = 'TAB_BAR';
1615

1716
var ScrollableTabView = React.createClass({
1817
getDefaultProps() {
@@ -26,15 +25,11 @@ var ScrollableTabView = React.createClass({
2625
},
2726

2827
componentWillMount() {
29-
this.state.scrollValue.addListener(({value}) => {
30-
this.refs[TAB_BAR_REF] &&
31-
this.refs[TAB_BAR_REF].setAnimationValue(value);
32-
});
33-
3428
var release = (e, gestureState) => {
3529
var relativeGestureDistance = gestureState.dx / deviceWidth,
3630
lastPageIndex = this.props.children.length - 1,
37-
vx = gestureState.vx;
31+
vx = gestureState.vx,
32+
newPage = this.state.currentPage;
3833

3934
if (relativeGestureDistance < -0.5 || (relativeGestureDistance < 0 && vx <= 0.5)) {
4035
newPage = newPage + 1;
@@ -43,7 +38,7 @@ var ScrollableTabView = React.createClass({
4338
}
4439

4540
this.props.hasTouch && this.props.hasTouch(false);
46-
this.goToPage(newPage);
41+
this.goToPage(Math.max(0, Math.min(newPage, this.props.children.length - 1)));
4742
}
4843

4944
this._panResponder = PanResponder.create({
@@ -79,14 +74,14 @@ var ScrollableTabView = React.createClass({
7974
},
8075

8176
goToPage(pageNumber) {
82-
if (this.props.currentPage == pageNumber) {
83-
return;
84-
}
85-
8677
this.props.onChangeTab && this.props.onChangeTab({
8778
i: pageNumber, ref: this.props.children[pageNumber]
8879
});
8980

81+
this.setState({
82+
currentPage: pageNumber
83+
});
84+
9085
Animated.spring(this.state.scrollValue, {toValue: pageNumber, friction: 10, tension: 50}).start();
9186
},
9287

@@ -116,7 +111,7 @@ var ScrollableTabView = React.createClass({
116111
{this.renderTabBar({goToPage: this.goToPage,
117112
tabs: this.props.children.map((child) => child.props.tabLabel),
118113
activeTab: this.state.currentPage,
119-
ref: TAB_BAR_REF})}
114+
scrollValue: this.state.scrollValue})}
120115

121116
<Animated.View style={[sceneContainerStyle, {transform: [{translateX}]}]}
122117
{...this._panResponder.panHandlers}>

0 commit comments

Comments
 (0)