我在组件渲染期间有一个非常典型的滞后动画问题 . 但是,据我所知,我在react-native文档中找到的常见解决方案无法应用于我的用例 .
让我解释一下:我有一个标签寻呼机实现了(i)包含一组页面的ViewPagerAndroid和(ii)由一组可触摸和一条线(Animated.View)组成的标签栏,当它移动时(translateX变换)寻呼机X滚动值的变化 .
每个页面组件遵循相同的逻辑:
-
当调用componentDidMount时,它会触发网络调用以加载数据
-
加载数据后,将使用新数据更新状态,并重新呈现组件
-
render方法只返回一个显示已加载数据的FlatList(仅限20个项目)
我的问题是:如果用户在呈现页面时单击选项卡,则动画会非常滞后 . 鉴于动画和重新渲染是在UI线程上执行的,我猜他们正在以某种方式竞争 .
我消除了各种原因,但无法找到合适的解决方案来保持动画流畅:
-
我用硬编码数据和简单的超时替换了网络调用;重新呈现页面时,UI仍然是滞后的
-
我试图改善重新渲染时间,但即使使用纯组件,FlatList也很慢 .
-
我在发布模式下尝试过,没有任何区别
-
问题也发生在物理设备上(Nexus 5X,功能非常强大)
-
这不是我的实现,我试过github.com/skv-headless/react-native-scrollable-tab-view和github.com/zbtang/React-Native-ViewPager
-
我知道InteractionManager和TimerMixin.requestAnimationFrame,但是's useless in my case: when the rendering is started, the user can still click on the tab bar buttons and it'不是等待渲染结束(滞后)的选项 .
我将我的代码上传到github存储库(https://github.com/benjaminbillet/tabbartest),以防您想要了解更多详细信息 . 它's quite straightforward, but don'犹豫地问我更多细节 .
一些其他信息:
-
react-native 0.46.4
-
节点8.2.0
-
npm 5.3.0
-
仅在Android上尝试过 .
你认为我应该填写错误报告吗?
非常感谢 .
EDIT-1 这是动画代码的简化版本:
render() {
const underlineStyle = {
position: 'absolute',
left: 0,
bottom: 0,
width: this.tabWidth,
height: underlineHeight,
backgroundColor: underlineColor,
transform: [{
translateX: this.pagerScrollX.interpolate({
inputRange: [0, 1],
outputRange: [0, this.tabWidth],
}),
}],
};
return (
<View style={[styles.tabs, style]}>
...
<Animated.View style={underlineStyle} />
</View>
);
}
onPageScroll(offset) {
const { offset, position } = e.nativeEvent;
this.pagerScrollX.setValue(position + offset);
}