美文网首页
ReactNative手势

ReactNative手势

作者: 玄策 | 来源:发表于2017-12-07 17:05 被阅读21次

目录

  • 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 (
       <View 
          {...this._panResponder.panHandlers} 
          style={styles.container}>
        <Text>stateID 触摸状态的ID = {this.state.gestureState.stateID}</Text>
        <Text>moveX 最近一次移动时的屏幕横坐标 = {this.state.gestureState.moveX}</Text>
        <Text>moveY 最近一次移动时的屏幕纵坐标 = {this.state.gestureState.moveY}</Text>
        <Text>x0 当响应器产生时的屏幕坐标 = {this.state.gestureState.x0}</Text>
        <Text>y0 当响应器产生时的屏幕坐标 = {this.state.gestureState.y0}</Text>
        <Text>dx 从触摸操作开始时的累计横向路程 = {this.state.gestureState.dx}</Text>
        <Text>dy 从触摸操作开始时的累计纵向路程 = {this.state.gestureState.dy}</Text>
        <Text>vx 当前的横向移动速度 = {this.state.gestureState.vx}</Text>
        <Text>vy 当前的纵向移动速度 = {this.state.gestureState.vy}</Text>
        <Text>numberActiveTouches 当前在屏幕上的有效触摸点的数量 = {this.state.gestureState.numberActiveTouches}</Text>
       </View>
    );
  }
}


2)手势动画

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 (
        <View style={styles.container}>
            <Animated.View 
                {...this._panResponder.panHandlers}  
                style={{
                    backgroundColor:'orange',
                    width:50,height:50,
                    borderRadius:25,
                    transform:[
                        {
                            translateX:this.state.animVal.x
                        },
                        {
                            translateY:this.state.animVal.y
                        }
                    ]
                }}/>
        </View>
    );
  }
}

参考资料

官网


相关文章

网友评论

      本文标题:ReactNative手势

      本文链接:https://www.haomeiwen.com/subject/yaxjixtx.html