學習 React Native 17
開發觸摸以及手勢系統
程序員心理都明白,基于網頁開發的接口一般都是利用鼠標進行控制的。 我們使用象 Hover這一類的標簽狀態來展示交互行為以及回應用戶的響應。 對于移動設備來說, 最主要的就是使用觸碰事件。 移動平臺有自己的交互行為的規范,您只需根據該規范進行設計就好了。 不同的平臺會有著各種不一樣的表現行式: iOS 的互動行為和 Android 就完全不同,他們又都和 Windows Phone完全不一樣。
React Native 提供了大量的API 幫助您開發觸碰控制界面。 在這一章節里,我們主要來看看 <TouchableHighlight> 容器組件,同時也了解一下由 PanResponder 提供的底層的 APIs 以及手勢響應系統。
使用 TouchableHighlight:
任何去響應用戶觸摸的接口元素(考慮一下按鈕,控制元件等等吧),都應該被 <TouchableHightlight> 標簽包住。 TouchableHighlight 會在該元件被觸碰的時候在視圖上產生一個覆蓋層,以給用戶視覺上的反饋。這是一個最主要的交互行為讓這移動應用的頁面感覺更象原生一般, 而對于那些使用了網頁直接生成的移動端的頁面,則觸摸后的反饋行為是非常有限的。做為這個讓人翹大拇指的規則, 你應該在頁面所有使用了按鈕或是鏈接的地方使用 <TouchableHighlight />.
對于該標簽的最基礎的應用, 您只需要把組件包括在 <TouchableHighlight> 標簽中即可, 當該組件被按壓時,就會增添了一個很簡單的覆蓋層。 對于象 onPressIn, onPressOut, onLongPress等事件,<TouchableHighlight>組件也能給您提供一個事件勾子。比方說,您可以使用該特性開發一個只有在長按的情況下才會出現的菜單,等等吧。
以下代碼是一個簡單的示例,告訴你如何把組件包括在 <TouchableHighlight> 中以便于得到用戶的反饋:
<TouchableHighlight onPressIn={this._onPressIn} onPressOut={this._onPressOut} style={styles.touchable}> <View style={styles.button}> <Text style={styles.welcome}> {this.state.pressing ? 'EEK!' : 'PUSH ME'} </Text> </View> </TouchableHighlight>
當用戶點擊了該按鈕,就會出現一個覆蓋層,上面的文字也會發生了變化。
這不是一個非常貼切的示例, 但他能夠展示了這基本的交互行為可以使得按鈕的觸碰感覺很象在 iOS系統中的原生程序。 覆蓋層是很重要的回饋信息告訴用戶該元件是被點按了。 要特別注意的是為了顯示這個覆蓋已土又立, 我們并不需要為樣式表提供任何邏輯;<TouchableHighlight> 自己就幫我們把這些邏輯都處理好了。
下面是完整的按鈕組件的代碼:
'use strict'; var React = require('react-native'); var { AppRegistry, StyleSheet, Text, View, TouchableHighlight } = React; var Button = React.createClass({ getInitialState: function() { return {pressing: false}; }, _onPressIn: function() { this.setState({pressing: true}); },?_onPressOut: function() { this.setState({pressing: false}); }, render: function() { return ( <View style={styles.container}> <TouchableHighlight onPressIn={this._onPressIn} onPressOut={this._onPressOut} style={styles.touchable}> <View style={styles.button}> <Text style={styles.welcome}> {this.state.pressing ? 'EEK!' : 'PUSH ME'} </Text> </View> </TouchableHighlight> </View> ); } }); // Styles var styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, welcome: { fontSize: 20, textAlign: 'center', margin: 10, color: '#FFFFFF' }, touchable: { borderRadius: 100 }, button: { backgroundColor: '#FF0000', borderRadius: 100, height: 200, width: 200, justifyContent: 'center' }, }); module.exports = Button;
試著修改這段按鈕的代碼看看該按鈕是如何響應其他不同的事件, 也試著用一用象onPress 或者是 onLongPress 這一類事件。 當然了最好的感知這些事件是如何被響應,以及如何被處理的,最好的方式就是使用真實的設備。
手勢響應系統
如果您需要處理的不僅僅就是點按方式,那應該怎么辦? React Native 也提供了另外兩個API以協助您定制開發觸碰事件: GestureResponder 和 PanResponder。 GestureResponder是一個低層的 API, 為 PanResponder提供了一個很有用的類抽象。 我們先開始研究一下 GestureResponder 系統工作方式,因為他是 PanResponder’s API的基礎。
移動設備的觸碰相對來說是很復雜的。 大部分的移動平臺是支持多點觸碰的, 那則意味著同時可以在觸摸屏上會有多個觸控點被激發。 (當然這些觸碰也不會完全都是手指的事件了,例如,用戶使用手掌支撐在屏幕的下角)另外,這里還有一個問題就是哪些視圖中是需要處理觸碰的。 這個問題和在網頁上處理鼠標事件是一樣的, 默認的處理方式也基本上一樣: 最頂端的子句柄會默認得到觸碰事件。 在React Naitve’s的手勢響應系統里,我們如果想使用這種試就可以直接調用該接口。
不深思則不能造于道。不深思而得者,其得易失。
名人名言- 曾國藩
- By 優聯實達
- 2016-01-12
- 11865
- 公司新聞,網站開發,網站設計,UI