React-Native 之 Touchable 介紹與使用

前言

  • 學習本系列內容需要具備一定 HTML 開發基礎,沒有基礎的朋友可以先轉至 HTML快速入門(一) 學習

  • 本人接觸 React Native 時間并不是特別長,所以對其中的內容和性質了解可能會有所偏差,在學習中如果有錯會及時修改內容,也歡迎萬能的朋友們批評指出,謝謝

  • 文章第一版出自簡書,如果出現圖片或頁面顯示問題,煩請轉至 簡書 查看 也希望喜歡的朋友可以點贊,謝謝

View 中的觸摸屬性 與 Touchable 的對比


  • 學完之前的內容后,是不是有個疑問 —— 界面我們是搭建出來了,那為什么不會對用戶的點擊、觸摸、拖拽做出反應?這篇就結合前面的內容加上小案例來解答疑惑

  • 其實在 React Native 中,想實現手勢監聽很簡單,有兩種方式

    • 標簽中有許多 on 開頭的屬性可以供我們使用,但是在不同標簽上有的屬性是不能做出相應的響應的,比如下面的例子,同樣的屬性,在View上不可使用,在Text上就可以


        var textInputTest = React.createClass({
            render(){
                return(
                    <View style={styles.container}>
                        {/* 實例化一個View */}
                        <View style={styles.testViewStyle} onPressIn={() => {alert('點擊')}}>
                        </View>
                        {/* 實例化一個Text */}
                        <Text style={styles.testTextStyle} onPress={() => {alert('點擊')}}></Text>
                    </View>
                );
            }
        });
    
        var styles = StyleSheet.create({
            container: {
                flex:1,
                backgroundColor:'gray'
            },
    
            testViewStyle: {
                // 設置尺寸
                width:width,
                height:40,
                marginTop:20,
                // 設置背景顏色
                backgroundColor:'red'
            },
    
            testTextStyle: {
                // 設置尺寸
                width:width,
                height:40,
                marginTop:20,
                // 設置背景顏色
                backgroundColor:'yellow'
            }
        });
    

    效果:

行內on屬性行為比對.gif
  • 為了避免上面問題,在開發中推薦使用 Touchable 的方式來實現用戶點擊事件的包裝

    • 首先,既然要使用Touchable,那么肯定要先告訴系統在哪里找到它


        import {
            AppRegistry,
            StyleSheet,
            Text,
            View,
            TouchableOpacity
        } from 'react-native';
    
    
    • 完成上面的步驟我們就可以使用Touchable來包裝我們的標簽了,格式如下


        <TouchableOpacity Touchable屬性>
            <需要包裝的標簽></需要包裝的標簽>
        </TouchableOpacity>
        
    
    • 這里就來將上面的方式更改一下,從中可以看出,不僅可以讓標簽有接收觸摸事件能力,還出現了不透明的效果(類似于高亮的效果)


        var textInputTest = React.createClass({
            render(){
                return(
                    <View style={styles.container}>
                        {/* 包裝View */}
                        <TouchableOpacity
                            onPress={() => {alert('點擊了View')}}
                >
                        <View style={styles.testViewStyle}></View>
                        </TouchableOpacity>
                        {/* 包裝Text */}
                        <TouchableOpacity
                            onPress={() => {alert('點擊了Text')}}
                >
                            <Text style={styles.testTextStyle}></Text>
                        </TouchableOpacity>
                    </View>
                );
            }
        });
    
    

    效果:

Touchable行為比對.gif
  • 好了,先介紹到這里,下面來看下Touchable常用屬性

Touchable 常用屬性介紹


  • Touchable 中包含兩種觸摸類別:TouchableHighlight(高亮觸摸)、TouchableOpacity(不透明觸摸)
    • TouchableHighlight(高亮觸摸):當手指點下的時候,該視圖的不透明度會進行降低同時會看到相應的顏色(原理:在底層新添加一個View),需要注意的是TouchableHighlight只能進行一層嵌套,不能多層嵌套,如果需要多層嵌套就要用View包裝

      • activeOpacity:設置組件在進行觸摸時候,顯示的不透明度(取值:0 ~ 1)
      • onHideUnderlay:當底層被隱藏的時候調用
      • onShowUnderlay:當底層顯示的時候調用
      • style:可以設置控件的風格演示,該風格演示可以參考View組件的style
      • underlayColor:當觸摸或者點擊控件的時候顯示出的顏色
      • TouchableWithoutFeedback:這個屬性說明了這個組件繼承了所有TouchableWithoutFeedback的屬性
        • disabled:如果為true,則禁止此組件的一切交互
        • hitSlop {top: number, left: number, bottom: number, right: number}:這一屬性定義了按鈕的外延范圍。這一范圍也會使pressRetentionOffset(見下文)變得更大。 注意:觸摸范圍不會超過父視圖的邊界,也不會影響原先和本組件層疊的視圖(保留原先的觸摸優先級)
        • onLayout{nativeEvent: {layout: {x, y, width, height}}}:當加載或者布局改變的時候被調用
        • onLongPress:長按
        • onPress:點擊
        • onPressIn:按住
        • onPressOut:抬起
        • pressRetentionOffset {top: number, left: number, bottom: number, right: number}:在當前視圖不能滾動的前提下指定這個屬性,可以決定當手指移開多遠距離之后,會不再激活按鈕。但如果手指再次移回范圍內,按鈕會被再次激活。只要視圖不能滾動,你可以來回多次這樣的操作。確保你傳入一個常量來減少內存分配
    • TouchableOpacity(不透明觸摸):該組件封裝了響應觸摸事件,當點擊按下的時候,該組件的透明度會降低

      • activeOpacity:設置當用戶觸摸的時候,組件的透明度(取值:0 ~ 1)
      • TouchableWithoutFeedback:這個屬性說明了這個組件繼承了所有TouchableWithoutFeedback的屬性
        • disabled:如果為true,則禁止此組件的一切交互
        • hitSlop {top: number, left: number, bottom: number, right: number}:這一屬性定義了按鈕的外延范圍。這一范圍也會使pressRetentionOffset(見下文)變得更大。 注意:觸摸范圍不會超過父視圖的邊界,也不會影響原先和本組件層疊的視圖(保留原先的觸摸優先級)
        • onLayout{nativeEvent: {layout: {x, y, width, height}}}:當加載或者布局改變的時候被調用
        • onLongPress:長按
        • onPress:點擊
        • onPressIn:按住
        • onPressOut:抬起
        • pressRetentionOffset {top: number, left: number, bottom: number, right: number}:在當前視圖不能滾動的前提下指定這個屬性,可以決定當手指移開多遠距離之后,會不再激活按鈕。但如果手指再次移回范圍內,按鈕會被再次激活。只要視圖不能滾動,你可以來回多次這樣的操作。確保你傳入一個常量來減少內存分配

常見的觸摸事件演示


  • TouchableHighlight(高亮觸摸)
    var textInputTest = React.createClass({
        render(){
            return(
                <View style={styles.container}>
                    {/* 點擊 */}
                    <TouchableHighlight
                        onPress={() => {alert('點擊')}}
                        underlayColor={'red'}
                    >
                        <View style={styles.testViewStyle}></View>
                    </TouchableHighlight>

                    {/* 按下 */}
                    <TouchableHighlight
                        onPressIn={() => {alert('按下')}}
                        underlayColor={'orange'}
                    >
                        <View style={styles.testViewStyle}></View>
                    </TouchableHighlight>

                    {/* 抬起 */}
                    <TouchableHighlight
                        onPressOut={() => {alert('抬起')}}
                        underlayColor={'blue'}
                    >
                        <View style={styles.testViewStyle}></View>
                    </TouchableHighlight>

                    {/* 長按 */}
                    <TouchableHighlight
                        onLongPress={() => {alert('長按')}}
                        underlayColor={'yellow'}
                    >
                        <View style={styles.testViewStyle}></View>
                    </TouchableHighlight>
                </View>
            );
        }
    });


效果:

TouchableHighlight效果.gif
  • TouchableOpacity(不透明觸摸)
    var textInputTest = React.createClass({
        render(){
            return(
                <View style={styles.container}>
                    {/* 點擊 */}
                    <TouchableOpacity
                        onPress={() => {alert('點擊')}}
                    >
                        <View style={styles.testViewStyle}></View>
                    </TouchableOpacity>

                    {/* 按下 */}
                    <TouchableOpacity
                        onPressIn={() => {alert('按下')}}
                    >
                        <View style={styles.testViewStyle}></View>
                    </TouchableOpacity>

                    {/* 抬起 */}
                    <TouchableOpacity
                        onPressOut={() => {alert('抬起')}}
                    >
                        <View style={styles.testViewStyle}></View>
                    </TouchableOpacity>

                    {/* 長按 */}
                    <TouchableOpacity
                        onLongPress={() => {alert('長按')}}
                    >
                        <View style={styles.testViewStyle}></View>
                    </TouchableOpacity>
                </View>
            );
        }
    });

效果:

TouchableOpacity效果.gif
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容