android - 反应本机:在android上损坏的滚动视图内使用panResponder
问题描述
我知道这个问题已被多次提出,但我还没有找到任何其他线程的有效修复(其中大多数几乎没有回复)。
在我的实现中,我有一个 ScrollView,它是一个项目列表的父项,每个项目都有一个 panResponder 用于横向滑动(如火种卡)。
我遇到的问题是 ScrollView 停止 panResponder 中间动画并优先考虑滚动。
我尝试过动态切换滚动scrollEnabled
视图onPanResponderGrant
,onPanResponderRelease
但这不是一个可行的解决方案,因为在 panResponder 上垂直滚动会触发onPanResponderGrant
禁用滚动。
这是我的实现panResponder
:
this._panResponder = PanResponder.create({
onStartShouldSetPanResponder: (evt, gestureState) => true,
onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
onMoveShouldSetPanResponder: (evt, gestureState) => false,
onMoveShouldSetPanResponderCapture: (evt, gestureState) => false,
onShouldBlockNativeResponder: (evt, gestureState) => false,
onPanResponderTerminationRequest: () => false,
onPanResponderGrant: (event, gestureState) => {
this.pan.setValue(0);
this.opacity.setValue(0)
this.rotation.setValue(0)
},
onPanResponderMove: (event, gesture) => {
this.pan.setValue(gesture.dx)
this.rotation.setValue(gesture.dx)
this.opacity.setValue(gesture.dx)
},
onPanResponderRelease: (event, gestureState) => {
if(gestureState.dx < -SWIPE_THRESHOLD){
this.removeCard()
} else {
this.resetPosition()
}
}
});
这是呈现每张可刷卡的 FlatList:
<FlatList
data={this.state.cards}
keyExtractor={item => item.id}
renderItem={({ item }) => (
<DataCard
type={item.type}
name={item.name}
/>
)}
/>
从那以后,我换了ScrollView
一个FlatList
,希望能神奇地解决这个问题,但没有运气。
此功能在 iOS 上完美运行,但问题仍然是 android。
似乎这是一个非常普遍的问题,没有具体的解决方案。这就是我希望通过发布这个。
谢谢!
解决方案
我知道已经很晚了,但我希望这个答案能帮助像我一样遇到同样问题的其他人。 当两个不同的父组件试图停止你的动画时,看起来 PanResponder 不能很好地支持(在这种情况下,你在 ScrollView 中有一个 FlatList)
对我有用的解决方案是将 FlatList 的 scrollEnabled 设置为 false(当您在另一个滚动视图中时它仍然可以工作)这样平移响应器将不得不只处理 ScrollView
另外 - 不要忘记设置“onPanResponderTerminate()”以让组件返回到初始位置并将 scrollable=true 返还给父组件(ScrollView),如下所示:
onPanResponderTerminate: () => {
this.props.changeScrollable(true);
this.resetPosition();
},
我真的希望这足够清楚,这将有助于某人!
推荐阅读
- javascript - 如果 case A OR B 和其他事情,如果 case A XOR B,切换我想做一些事情的 case?
- powershell - 夏普串口 RS232
- python - werkzeug.routing.BuildError:无法为端点“成功”构建 url。您是否忘记指定值 ['name']?
- c# - Winforms:“数字”运算符后缺少操作数
- python - Python循环文本文件以查找和打印
- node.js - 如何根据mongodb聚合中的字段值获取文档详细信息
- python-3.x - 我需要向 tkinter exe 程序添加代码吗?
- php - 无法使用 API 将具有变体的产品添加到 eBay
- c# - CefSharp 实时更改 UserAgent
- c++ - 这个 shared_ptr 如何自动转换为原始指针?