背景 移動設備
上的各類點擊事件與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) => {...}