【发布时间】:2018-04-09 08:33:21
【问题描述】:
我正在开发一个应用程序,我试图根据多个ScrollViews 的滚动位置为View 设置动画。
这就是屏幕的样子。
上面的屏幕有2个部分
- 顶部有一个
View组件 - 底部有一个
TabNavigator组件
TabNavigator 中的每个选项卡都有一个 ScrollView (在这种情况下有 2 个但可以更多),我想要实现的是在用户向下滚动时折叠 View 并在用户向上滚动。
在一个选项卡上我做得很好,它完全按照我想要的方式工作,但是当我添加第二个选项卡时问题就来了。
问题
当我在 tab1 上滚动一点并移动到 tab2 并尝试滚动时,它会变得生涩。查看 GIF 以了解我想说的内容
更新
在 expo.io 上查看此零食以实时查看问题
我尝试了什么
App.js
export default class App extends Component {
constructor (props) {
super(props)
this.state = {
/* omitted - not related */
scrollY: new Animated.Value(0)
}
}
render () {
let translateY = this.state.scrollY.interpolate({
inputRange: [0, 600],
outputRange: [0, -290],
extrapolate: 'clamp'
});
let TabsTranslateY = this.state.scrollY.interpolate({
inputRange: [0, 600],
outputRange: [0, -290],
extrapolate: 'clamp'
});
return (
<View style={styles.container}>
<Animated.View style={{transform: [{translateY: translateY}], overflow: 'hidden'}}>
<Text style={styles.welcome}>
Welcome to React Native!!
</Text>
<Text style={styles.time}>
{this.state.hour} : {this.state.minute}
</Text>
<TouchableOpacity onPress={() => { /* omitted */ }} style={styles.button}><Text style={styles.buttonText}>Set Time</Text></TouchableOpacity>
</Animated.View>
<Animated.View style={{
flex: 0,
transform: [{translateY: TabsTranslateY}],
height: Dimensions.get('window').height
}}>
<Tabs removeClippedSubviews={false} screenProps={{animatedScrollY: this.state.scrollY}}/>
</Animated.View>
</View>
)
}
}
const styles = StyleSheet.create({/* omitted styles*/})
Home.js (Tab1)
/* omitted imports */
export default class Home extends Component {
/* omitted navigation options */
constructor (props) {
super(props)
this.state = {
scrollY: this.props.screenProps.animatedScrollY
}
}
render () {
return (
<View>
<Animated.ScrollView onScroll={Animated.event(
[{nativeEvent: {contentOffset: {y: this.state.scrollY}}}],
{useNativeDriver: true}
)} scrollEventThrottle={16}>
{Array(90).fill().map((v, i) => {
return <Text key={i}
style={{flex: 1, backgroundColor: '#333', padding: 20, marginVertical: 10, color: 'white'}}>Item
#{i + 1}</Text>
})}
</Animated.ScrollView>
</View>
)
}
}
Photos.js (Tab2)
/* omitted imports */
export default class Photos extends Component {
/* omitted navigation options */
constructor (props) {
super(props)
this.state = {
PhotosScrollY: this.props.screenProps.animatedScrollY
}
}
render () {
return (
<Animated.ScrollView onScroll={Animated.event(
[{nativeEvent: {contentOffset: {y: this.state.PhotosScrollY}}}],
{useNativeDriver: true}
)} scrollEventThrottle={16}>
<View style={{flex: 1,}}>
{Array(90).fill().map((v, i) => {
return <View key={i} style={/* omitted */}>
<Text style={/* omitted */}>
Photo #{i + 1}
</Text>
</View>
})}
</View>
</Animated.ScrollView>
)
}
}
我不知道如何解决这个问题,任何建议和解决方案都非常感谢。
谢谢。
【问题讨论】:
-
如果直接从 props 中使用而不分配给 state 会怎样?
-
@AlexanderVitanov 你说的是
animatedScrollY对吧? - 不,我不能直接从状态中使用选项卡,因为这仅在 App.js 中可用,即使我认为这不会改变任何东西。 -
@Azeem Hassni,你能添加你的 Tab.js 文件吗?
-
当然可以在小吃里查看snack.expo.io/SytBkdBAW ->
/Tabs/index.js -
假设您打开应用程序,在主页选项卡上向下滚动一点,然后切换到项目选项卡。项目列表应该在顶部吗?如果是这样,并且无法向上滚动,您将如何显示标题?
标签: javascript android ios animation react-native