与父PanResponder的TouchableOpacity

Max*_*man 9 gestures react-native

我的父母PanResponder有一个孩子的TouchableOpacity.会发生什么是TouchableOpacity因为点击而不响应PanResponder点击.我试图遵循本指南但没有成功:http: //browniefed.com/blog/react-native-maintain-touchable-items-with-a-parent-panresponder/

这是我的代码:

this._panResponder = PanResponder.create({
            onStartShouldSetPanResponder: (evt, gestureState) => true,
            onStartShouldSetPanResponderCapture: (evt, gestureState) => false,
            onMoveShouldSetResponderCapture: () => true,
            onMoveShouldSetPanResponder: (evt, gestureState) => true,
            onMoveShouldSetPanResponderCapture: (evt, gestureState) => {
                return gestureState.dx != 0 && gestureState.dy != 0;
            },
            onPanResponderGrant: (evt, gestureState) => {
                let isFirst = gestureState.y0 > 164 ? false : true;
                this.setState({animObj: isFirst, isUsingCurtain: true});
            },
            onPanResponderMove: (evt, gestureState) => {

                //let Y = this.state.animObj ? gestureState.moveY - this.state.currentHeaderHeight  : gestureState.moveY - this.state.currentHeaderHeight ;// - this.state.currentHeaderHeight;
                let Y = gestureState.moveY - this.state.currentHeaderHeight + 20
                if (Y < 0) {
                    return false
                }
                this.state.animCurtain.setValue(Y);
                gestureState.moveY > height / 2 ? this.setState({curtainOnMiddle: true}) : this.setState({curtainOnMiddle: false})
            },
            onPanResponderTerminationRequest: (evt, gestureState) => true,
            onPanResponderRelease: (evt, gestureState) => {
                if (((height / 2) > gestureState.moveY)) {//slide back up1
                    this._CurtainAnimation(0, false);
                } else {//slide to bottom
                    let val = height - calcSize(180);
                    this._CurtainAnimation(val, true);
                }
            },
            onPanResponderTerminate: (evt, gestureState) => {
            },
            onPanResponderStart: (e, gestureState) => {
            },
        });
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

<Animated.View
            style={[styles.bottomHPHeader, TopArroOpacity ? {opacity: TopArroOpacity} : ""]} {...this._panResponder.panHandlers}>
            <TouchableOpacity onPress={() => this._animateAutoCurtain()}>
                {this.state.curtainOnMiddle ?
                    <AIIcon image={require('../../../../assets/images/homepage/close_drawer_arrow.png')}
                            boxSize={30}/>
                    : <AIIcon image={require('../../../../assets/images/homepage/open_drawer_arrow.png')}
                              boxSize={30}/>}
            </TouchableOpacity></Animated.View>
Run Code Online (Sandbox Code Playgroud)

谢谢

Max*_*man 13

我的案例的解决方案是修改 onMoveShouldSetPanResponder

onMoveShouldSetPanResponder: (evt, gestureState) => {
    //return true if user is swiping, return false if it's a single click
                return !(gestureState.dx === 0 && gestureState.dy === 0)                  
}
Run Code Online (Sandbox Code Playgroud)


Stu*_*ugh 8

我有同样的问题。该解决方案是上述解决方案的组合。必须为 onMoveShouldSetPanResponder 和 onMoveShouldSetPanResponderCapture 添加条件。这是我所做的。

 onMoveShouldSetPanResponder: (_, gestureState) => {
    const { dx, dy } = gestureState
    return (dx > 2 || dx < -2 || dy > 2 || dy < -2)
  },
  
onMoveShouldSetPanResponderCapture: (_, gestureState) => {
    const { dx, dy } = gestureState
    return (dx > 2 || dx < -2 || dy > 2 || dy < -2)
  },
Run Code Online (Sandbox Code Playgroud)

  • 你这个该死的救星!我花了几个小时试图理解为什么没有一个可触摸对象在使用 PanResponder 的 AnimatedView 中工作。应该写在某个地方,除非 PanResponder 处于“非活动状态”,否则 panResponder 内的任何内容都不能发出其可触摸事件 (2认同)

Mah*_*our 5

this.panResponder = PanResponder.create({
    onStartShouldSetPanResponderCapture: (evt, gestureState) => false,
});
Run Code Online (Sandbox Code Playgroud)


Flo*_*iec 5

完善!由于敏感性,我只需要进行调整。

onMoveShouldSetPanResponder: (evt, gestureState) => {
      const { dx, dy } = gestureState
      return dx > 2 || dx < -2 || dy > 2 || dy < -2
}
Run Code Online (Sandbox Code Playgroud)

  • 这个效果很好。但我没有检查是否为负数,而是改为 Math.abs: `return Math.abs(gestureState.dx) &gt; 2 || Math.abs(gestureState.dy) &gt; 2;` (4认同)
  • 如果我能给你更多的选票,我会的。谢谢!我的手指很胖,不知道如何调整灵敏度。太棒了 (2认同)