是否可以只滚动到一个方向?我有一个功能可以检测用户滚动的方向。
但我不知道如何设置一个标志,如果用户不回答问题,它就不允许他只向左滚动?
谢谢你
是否可以只滚动到一个方向?我有一个功能可以检测用户滚动的方向。
但我不知道如何设置一个标志,如果用户不回答问题,它就不允许他只向左滚动?
谢谢你
我创建了一个小例子,只允许向右滚动。当然,这个例子可以适应在特定条件下允许左滚动。在代码中,我标记了添加此类条件的位置。
该示例由两个主要部分组成。
检测滚动方向
解释见代码注释
handleScroll(event){
// WIDTH originates from Dimensions.get('screen').width
const endOfView = event.nativeEvent.contentSize.width - WIDTH;
const positionX = event.nativeEvent.contentOffset.x;
const positionY = event.nativeEvent.contentOffset.y;
// check if we are scrolling left, also detect if we are at the end of the scrollview
// MARKED: check other conditions here to allow scrolling again
if(this.state.lastPositionX > positionX && endOfView > positionX){
// we are scrolling left, disable scroll, reset the current position
this.setState({ lastPositionX: positionX, lastPositionY: positionY, allowScroll: false });
// scroll back to last valid position. Important! Otherwise users may be able to scroll left
this._scrollview.scrollTo({x: this.state.lastPositionX, y: this.state.lastPositionY});
//call the timer to enable scroll again
this.callTimer();
}else{
// we are scrolling right, everthing is fine
this.setState({ lastPositionX: positionX, lastPositionY: positionY });
}
}
再次启用滚动:
我们正在使用计时器在指定的时间后再次启用滚动。
timerFn() {
// clear the timer again, otherwise the timer will fire over and over again
clearInterval(this.state.timer);
//enable scroll and reset timer
this.setState({allowScroll: true, timer: null });
}
callTimer() {
if (this.state.timer == null ){
// no timer is available, we create a new one. Maybe you have to fine tune the duration
let timer = setInterval(() => this.timerFn(), 1000);
this.setState({timer});
}
}
使成为:
<SafeAreaView style={styles.container}>
<ScrollView
horizontal
scrollEventThrottle={15}
scrollEnabled={this.state.allowScroll}
onScroll={(event) => this.handleScroll(event)}
ref={view => this._scrollview = view}
>
<View style={{width: WIDTH, backgroundColor: 'red'}} />
<View style={{width: WIDTH, backgroundColor: 'green'}} />
<View style={{width: WIDTH, backgroundColor: 'blue'}} />
</ScrollView>
</SafeAreaView>
你可以使用react-native-directed-scrollview
包
包: https ://www.npmjs.com/package/react-native-directed-scrollview
这个包有scrollTo({x: 100, y: 100, animated: true})
方法。如果您将 x 轴坐标限制为您的条件,那就没问题了。
所以尝试这样的事情,
if(isAnswered == false){
scrollTo({x: /*x-axis position*/, y: /*y-axis position*/, animated: true})
}
注意:您可以传递false
给animated
参数。它是可选的。
对于任何想要一个具有隐藏内容但需要RefreshControl
a 功能的固定高度容器的人ScrollView
,我所做的是使用 aScrollView
但固定它的高度。
当我想显示其他内容时,我会为每个内容块的高度/不透明度设置动画以产生滚动效果。
<ScrollView
refreshControl={...}
style={{ height: contentBlockHeight, overflow: 'hidden' }}
contentContainerStyle={{ height: contentBlockHeight, overflow: 'hidden' }}
>
...
</ScrollView>