背景 移动设备
上的各类点击事件与web
上彻底不同, 在web
上,应用与用户交互是经过鼠标
,只能利用鼠标的单击
操做;而在移动设备
上,是经过手势系统
,用户是经过触摸屏幕
与应用交互的,这里的状况比web
上要复杂不少,好比 App 须要判断用户的触摸究竟是在滚动页面,仍是滑动一个 widget,或者只是一个单纯的点击。甚至还有多点同时触控的状况。react
React Native
是经过 Gesture Responder System 来管理app中的手势操做
的整个生命周期的。git
如何响应用户的触摸事件
利用gesture responder system
,一个View
只须要要实现了一些定义好的方法,就能够响应触摸事件了:github
若是 View 返回 true,并开始尝试成为响应者,那么会触发下列事件之一:web
若是 View 已经开始响应触摸事件了,那么下列这些处理函数会被一一调用:react-native
手势响应系统
用起来可能比较复杂。因此RN
利用了手势响应系统
封装了一个抽象的Touchable实现(TouchableOpacity、TouchableHighlight等),用来作可触控
的组件,使得你能够简单地以声明的方式来配置触控处理。他们能够绑定4种不一样的响应方法app
而对于手指滑动(拖拽)、多点触控等操做,利用上面的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
中的回调函数的增强版本:this
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) => {...}