2019-02-18 关于React Native Gestur

2019-02-18  本文已影响0人  KingAmo

React Native Gesture Handler是什么?

React Native Gesture HandlerExpo公司推出的一个库,目的是替代React Native自带的 Gesture Responder System

React Native Gesture Handler可以带来等多的手势操作和更好的性能,因为它使用了各个平台原生的touch handling system 来处理手势。

背景

移动设备上的各种点击事件与web上完全不一样, 在web上,应用与用户交互是通过鼠标,只能利用鼠标的单击操作;而在移动设备上,是通过手势系统,用户是通过触摸屏幕与应用交互的,这里的情况比web上要复杂很多,比如 App 需要判断用户的触摸到底是在滚动页面,还是滑动一个 widget,或者只是一个单纯的点击。甚至还有多点同时触控的情况。

React Native 是通过 Gesture Responder System 来管理app中的手势操作的整个生命周期的。

如何响应用户的触摸事件

RN 自带的 gesture responder system

利用gesture responder system,一个View只需要要实现了一些定义好的方法,就可以响应触摸事件了:

如果 View 返回 true,并开始尝试成为响应者,那么会触发下列事件之一:

如果 View 已经开始响应触摸事件了,那么下列这些处理函数会被一一调用:

手势响应系统用起来可能比较复杂。所以RN利用了手势响应系统封装了一个抽象的Touchable实现(TouchableOpacity、TouchableHighlight等),用来做可触控的组件,使得你可以简单地以声明的方式来配置触控处理。他们可以绑定4种不同的响应方法

而对于手指滑动(拖拽)、多点触控等操作,利用上面的Touchable方法无法实现,于是RN 又在手势响应系统的基础上封装了一个 PanResponder 来处理更复杂的手势操作。封装后的PanResponder 方法的抽象程度更高,使用起来也更加方便:

panResponder = PanResponder.create({
    onStartShouldSetPanResponder: (evt, gestureState) => true,
    onMoveShouldSetPanResponder: (evt, gestureState) => true,
    onPanResponderGrant: (evt, gestureState) => {
        console.log('evt', evt)    
        console.log('gestureState', gestureState)
    },
    onPanResponderMove: (evt, gestureState) => {
        console.log('evt', evt)    
        console.log('gestureState', gestureState)
    },
    onPanResponderRelease: (evt, gestureState) => {
        console.log('evt', evt)    
        console.log('gestureState', gestureState)
    },
})
render() {
    <View style={styles.container}
        {...this.panResponder.panHandlers}
    > 
    ...
    </View>
}

PanResponder在手势响应系统的原生事件之外提供了一个新的gestureState对象,提供了更多实用的字段(具体可以看文档);并且handler响应器回调函数是原来gesture responder system中的回调函数的加强版本:

onMoveShouldSetPanResponder: (e, gestureState) => {...}
onMoveShouldSetPanResponderCapture: (e, gestureState) => {...}
onStartShouldSetPanResponder: (e, gestureState) => {...}
onStartShouldSetPanResponderCapture: (e, gestureState) => {...}
onPanResponderReject: (e, gestureState) => {...}
onPanResponderGrant: (e, gestureState) => {...}
onPanResponderStart: (e, gestureState) => {...}
onPanResponderEnd: (e, gestureState) => {...}
onPanResponderRelease: (e, gestureState) => {...}
onPanResponderMove: (e, gestureState) => {...}
onPanResponderTerminate: (e, gestureState) => {...}
onPanResponderTerminationRequest: (e, gestureState) => {...}
onShouldBlockNativeResponder: (e, gestureState) => {...}
上一篇下一篇

猜你喜欢

热点阅读