ReactNative手势


目录

  • 1)基本手势
  • 2)手势动画

1)基本手势

方法 说明
onStartShouldSetResponder: (evt) => true ACTION_DOWN时是否成为响应者
onMoveShouldSetResponder: (evt) => true ACTION_MOVE时是否成为响应者
onPanResponderGrant: (evt, gestureState) =>{} ACTION_DOWN事件
onPanResponderMove: (evt, gestureState) => ACTION_MOVE事件
onPanResponderRelease: (evt, gestureState) => ACTION_UP事件
12月-07-2017 16-29-11.gif
gestureState{} 参数说明
stateID 触摸状态的ID。在屏幕上有至少一个触摸点的情况下,这个ID会一直有效
x0 y0 当响应器产生时的屏幕坐标,即ACTION_DOWN时的坐标
moveX moveY 移动时的屏幕横坐标,右下方向分别为xy轴正向
dx dy 从触摸操作开始时的累计横纵向路程,开始触摸点的右下为xy轴正向,左上为xy轴反向
vx vy 横纵向移动速
numberActiveTouches 当前在屏幕上的有效触摸点的数量
export default class TouchAnim extends Component {
  constructor(props) {
    super(props);
    this.state = {
        gestureState:{},
    };
    this._panResponder = PanResponder.create({
        // 要求成为响应者:
        onStartShouldSetPanResponder: (evt, gestureState) => true,
        onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
        onMoveShouldSetPanResponder: (evt, gestureState) => true,
        onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,

      onPanResponderGrant: (evt, gestureState) => {
        // 开始手势操作。给用户一些视觉反馈,让他们知道发生了什么事情!
      },
      onPanResponderMove: (evt, gestureState) => {
        // 移动手势操作
        this.setState({
            gestureState:gestureState,
        })
      },
      onPanResponderTerminationRequest: (evt, gestureState) => true,
      onPanResponderRelease: (evt, gestureState) => {
        // 用户放开了所有的触摸点,且此时视图已经成为了响应者。
        // 一般来说这意味着一个手势操作已经成功完成。
      },
      onPanResponderTerminate: (evt, gestureState) => {
        // 另一个组件已经成为了新的响应者,所以当前手势将被取消。
      },
      onShouldBlockNativeResponder: (evt, gestureState) => {
        // 返回一个布尔值,决定当前组件是否应该阻止原生组件成为JS响应者
        // 默认返回true。目前暂时只支持android。
        return true;
      },
    });
  }

  render() {
    return (
       
        stateID 触摸状态的ID = {this.state.gestureState.stateID}
        moveX 最近一次移动时的屏幕横坐标 = {this.state.gestureState.moveX}
        moveY 最近一次移动时的屏幕纵坐标 = {this.state.gestureState.moveY}
        x0 当响应器产生时的屏幕坐标 = {this.state.gestureState.x0}
        y0 当响应器产生时的屏幕坐标 = {this.state.gestureState.y0}
        dx 从触摸操作开始时的累计横向路程 = {this.state.gestureState.dx}
        dy 从触摸操作开始时的累计纵向路程 = {this.state.gestureState.dy}
        vx 当前的横向移动速度 = {this.state.gestureState.vx}
        vy 当前的纵向移动速度 = {this.state.gestureState.vy}
        numberActiveTouches 当前在屏幕上的有效触摸点的数量 = {this.state.gestureState.numberActiveTouches}
       
    );
  }
}


2)手势动画

ReactNative手势_第1张图片
12月-07-2017 17-03-03.gif
export default class TouchAnim extends Component {
  constructor(props) {
    super(props);
    this.state = {
        animVal : new Animated.ValueXY(),   //ValueXY是一个方便的处理2D交互的办法,譬如旋转或拖拽
    };

    this._panResponder = PanResponder.create({
        // 要求成为响应者:
        onStartShouldSetPanResponder: (evt, gestureState) => true,

        // 开始手势操作。
        onPanResponderGrant: (evt, gestureState) => {
            
        },
        
        // 移动手势操作
        onPanResponderMove: //绑定动画
            Animated.event([
                null,   //忽略原生事件
                {dx:this.state.animVal.x,dy:this.state.animVal.y}
            ]),

        // 释放手势
        onPanResponderRelease: (evt, gestureState) => {
            //弹性动画,回到原点
            Animated.spring(this.state.animVal,{
                toValue:{x:0,y:0},
                friction:1,
                tension:100,
            }).start();
        },
    });
  }

  render() {
    return (
        
            
        
    );
  }
}

参考资料

官网


你可能感兴趣的:(ReactNative手势)