• 學習 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 PanResponderGestureResponder是一個低層的 API, PanResponder提供了一個很有用的類抽象。 我們先開始研究一下 GestureResponder 系統工作方式,因為他是 PanResponder’s API的基礎。

     

    移動設備的觸碰相對來說是很復雜的。 大部分的移動平臺是支持多點觸碰的, 那則意味著同時可以在觸摸屏上會有多個觸控點被激發。 (當然這些觸碰也不會完全都是手指的事件了,例如,用戶使用手掌支撐在屏幕的下角)另外,這里還有一個問題就是哪些視圖中是需要處理觸碰的。 這個問題和在網頁上處理鼠標事件是一樣的, 默認的處理方式也基本上一樣: 最頂端的子句柄會默認得到觸碰事件。 在React Naitve’s的手勢響應系統里,我們如果想使用這種試就可以直接調用該接口。

    不深思則不能造于道。不深思而得者,其得易失。

    名人名言- 曾國藩
    • By 優聯實達
    • 2016-01-12
    • 11865
    • 公司新聞,網站開發,網站設計,UI
  • 少妇高潮久久久久7777