React native 在React Native中,是否可以检测到刷卡与触控式应答器';s onStartShouldSetPanResponder?

React native 在React Native中,是否可以检测到刷卡与触控式应答器';s onStartShouldSetPanResponder?,react-native,React Native,现在,我在我的onStartShouldSetPanResponder中返回一个true,因此PanResponder想要处理点击和平移。有没有办法将其限制为仅平移,因为我需要一个TouchableHighlight来处理这个问题?(我知道手势应答器应该同时处理这两个问题,但“平移”应答器处理点击似乎很奇怪) 由于手势刚刚开始,因此开始时应设置PanResponder中的dx/dy为0。是否有任何方法可以检测它是否是点击的开始并返回false(如果是) 或者我应该在OnPanResponderR

现在,我在我的
onStartShouldSetPanResponder
中返回一个
true
,因此PanResponder想要处理点击和平移。有没有办法将其限制为仅平移,因为我需要一个
TouchableHighlight
来处理这个问题?(我知道手势应答器应该同时处理这两个问题,但“平移”应答器处理点击似乎很奇怪)

由于手势刚刚开始,因此开始时应设置PanResponder中的
dx
/
dy
为0。是否有任何方法可以检测它是否是点击的开始并返回false(如果是)


或者我应该在
OnPanResponderRelease
中检测它是点击还是平移?

panResponder有两个事件:

  • onStartShouldSetPanResponder(捕获)
  • onMoveShouldSetPanResponder(捕获)

我只能通过删除onStartShouldSetPanResponderCapture来解决这个问题

我可以通过onMoveShouldSetPanResponder方法实现这一点,如下所示:

onMoveShouldSetPanResponder: (evt, gestureState) => {
    return Math.abs(gestureState.dx) >= 1 || Math.abs(gestureState.dy) >= 1
}
如果x或y移动大于1,则返回true。为了检测点击,我必须用一个可触摸的元素来包装视图中包含乞丐的所有内容。下面是一个完整的工作示例:

class CircleTapExample extends Component {
    constructor(props) {
        super(props)
        this.position = new Animated.ValueXY({ x: 0, y: 0 });
        this.panResponder = PanResponder.create({
            onMoveShouldSetPanResponder: (evt, gestureState) => { return Math.abs(gestureState.dx) >= 1 || Math.abs(gestureState.dy) >= 1 },//true,
            onPanResponderMove: (evt, gestureState) => {
                console.log("I was moved")
                this.position.setValue({ x: gestureState.moveX, y: gestureState.moveY })
            },
        });
    }
    circleTapped() {
        // Do something here when tapped
        console.log("I was tapped")
    }
    render() {
        return (
            <Animated.View style={[styles.container, { ...this.position.getLayout() }]} {...this.panResponder.panHandlers}>
                <TouchableOpacity onPress={() => this.circleTapped()} style={{ flex: 1 }}>
                    <View style={styles.circle} />
                </TouchableOpacity>
            </Animated.View>
        )
    }
}
const styles = {
    container: {
        width: 75,
        height: 75,
        bottom: 5,
        left: 5,
        position: 'absolute'
    },
    circle: {
        width: 75,
        height: 75,
        borderRadius: 40,
        backgroundColor: 'red'
    }
}
class CircleTapExample扩展组件{
建造师(道具){
超级(道具)
this.position=new Animated.ValueXY({x:0,y:0});
this.panResponder=panResponder.create({
onMoveShouldSetPanResponder:(evt,gestureState)=>{return Math.abs(gestureState.dx)>=1 | | Math.abs(gestureState.dy)>=1},//true,
onPanResponderMove:(evt,手势状态)=>{
log(“我被感动了”)
this.position.setValue({x:gestureState.moveX,y:gestureState.moveY})
},
});
}
圆圈(){
//点击时在这里做些什么
日志(“我被点击”)
}
render(){
返回(
this.circleTapped()}style={{flex:1}}>
)
}
}
常量样式={
容器:{
宽度:75,
身高:75,
底部:5,
左:5,,
位置:'绝对'
},
圆圈:{
宽度:75,
身高:75,
边界半径:40,
背景颜色:“红色”
}
}