在阵营原住民 - 如何在平行而滚动型滚动
我正在开发一个TimeLine
组件移动View元素。横向ScrollView
内有Views
列表,代表半个小时的积木。我有一个名为TimeRangeSelector
的组件,我用它来选择TimeLine
ScrollView
中的一段时间。所以当我滚动ScrollView
时,我需要平行移动TimeRangeSelector
,没有任何延迟。以下是TimeLine
组件。你可以看到ScrollView
里面有30分钟的积木。黄色是TimeRangeSelector
这是一个Animated.View。并且使用滚动位置设置TimeRangeSelector
的左侧位置。每次ScrollView
移动im设置状态如下。
在阵营原住民 - 如何在平行而滚动型滚动
<ScrollView
horizontal={true}
onScroll={this.onScrollFunc}
>
{timelineElements}
</ScrollView>
onScrollFunc = (event, gesture) => {
this.setState({
contentOffsetX: event.nativeEvent.contentOffset.x,
scrollStopped: false
});
};
和IM传递scrollBarPosition当道具的TimeRangeSelector并设置其左侧位置,风格如下面的代码
<TimeRangeSelector
scrollBarPosition={this.state.contentOffsetX}
/>
let styles= [
{
position: "absolute",
left: this.props.scrollBarPosition,
backgroundColor: backgroundColor,
marginTop: 20,
marginLeft: 1,
width: this.state.selectionWidth,
height: 100
}
];
但问题是,当我滚动ScrollView
的TimeRangeSelector
移动与它,但它有一个延迟..当我滚动更快的距离,它应该在哪里,它在哪里,正在变高。任何人都可以根据你的知识给我一些想法。
我的假设:根据我的理解,我认为滞后是因为需要几个实例才能达到setState
并按照以下步骤设置ScrollBarPosition
。
-
ScrollView
移动了1帧。 -
ScrollView
打响onScroll
功能和emmits与新的x点的事件。 - 然后在
onScroll
功能它设置状态。
据我了解它需要一些时间一路发生的所有这些步骤从JavaScript线程本地线程,并再次回来JS线程。
你应该使用类似const onScroll = Animated.event([{ nativeEvent: { contentOffset: { x: animatedValue } } }], { useNativeDriver: true });
与const animatedValue = new Animated.Value(0)
。这样,动画只能在本地级别完成,而不需要在JS线程中来回切换。
该动画值只能用不透明有效利用和改造的样式属性,但它应该帮助你解决问题。
我已经在某处读过这个东西。但是我不知道实现这个的确切方法。我如何获得我们在此写入Animated.event的scrollView的确切位置。延迟是setState循环的原因吗?因为反正我需要设置状态滚动的滚动位置,那么只有我可以运行,以通过滚动位置的孩子(TimeRangeSelector) – sham999
位置被封装在事件中呈现,在不使用其记录本地驱动程序模式,请参阅。延迟是由setState引起的,并且从本地到JS代码出现。 –
是的,必须是。你能在这方面给我什么建议? @Daniel Schmidt – sham999