react native开发Android篇——绑定触摸系统PanResponder组件中的Touch...组件onPress无法触发


PanResponder类可以将多点触摸操作协调成一个手势。它使得一个单点触摸可以接受更多的触摸操作,也可以用于识别简单的多点触摸手势。

响应者的生命周期和文档啥的,api网站上写的很详细,我就不再啰嗦了,我在这里只说明PanResponder中的onPress事件如何触发,在onMoveShouldSetPanResponder中根据触摸的面积大小去判断是触发移动事件还是onPress事件即可,代码如下所示。

componentWillMount: function() {
    this._panResponder = PanResponder.create({
      //在用户开始触摸的时候(手指刚刚接触屏幕的瞬间),是否愿意成为响应者?
      onStartShouldSetPanResponder: (evt, gestureState) => true,
      onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
      onMoveShouldSetPanResponder: (evt, gestureState) => {
        //解决PanResponder中的onPress无作用
        //当大于5时才进入移动事件,有的情况下需要将onStartShouldSetPanResponderCapture设为false
        if (Math.abs(gestureState.dx) > 5 || Math.abs(gestureState.dy) > 5) {
          return true;
        } else if (Math.abs(gestureState.dx) == 0 || Math.abs(gestureState.dy) == 0) {
          return false;
        }
      },
      onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,

      onPanResponderGrant: (evt, gestureState) => {
        // 开始手势操作。给用户一些视觉反馈,让他们知道发生了什么事情!

        // gestureState.{x,y} 现在会被设置为0
      },
      onPanResponderMove: (evt, gestureState) => {
        // 最近一次的移动距离为gestureState.move{X,Y}

        // 从成为响应者开始时的累计手势移动距离为gestureState.d{x,y}
      },
      onPanResponderTerminationRequest: (evt, gestureState) => true,
      onPanResponderRelease: (evt, gestureState) => {
        // 用户放开了所有的触摸点,且此时视图已经成为了响应者。
        // 一般来说这意味着一个手势操作已经成功完成。
      },
      onPanResponderTerminate: (evt, gestureState) => {
        // 另一个组件已经成为了新的响应者,所以当前手势将被取消。
      },
      onShouldBlockNativeResponder: (evt, gestureState) => {
        // 返回一个布尔值,决定当前组件是否应该阻止原生组件成为JS响应者
        // 默认返回true。目前暂时只支持android。
        return true;
      },
    });
  },

  render: function() {
    return (
      <View {...this._panResponder.panHandlers} />
    );
  },
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐