React Native05 - 組件Image和九宮格效果

前言

之前有人問我學習一門技術,怎么樣才能最快速的掌握一門技術,我的回答是寫博客或者給別人講解。

這兩種方式有一個共性,那就是都需要專研。我們自己去學習的時候,容易有一種得過且過的心理,比如:“算了,不研究了,我知道怎么寫就行”。但當你寫博客或者講解的時候,就不能有這樣的心態了,你得專研他到底是什么原理,這樣你在寫博客或者給別人講解的過程中,你才會更加自信。同時你自己也再一步一步的提升。

廢話不多說了,本篇內容如下:

  • 組件Image
  • 九宮格案例來復習之前學習的知識

一、組件Image

  • 在開發中有一個非常重要的組件Image,通過這個組件可以展示各種各樣的圖片,而且在React Native中該組件可以通過多種方式加載圖片資源

  • 從當前RN項目中加載圖片
    <Image source={require("./img/2.png")} />
    
    • RN中引入其他文件中的內容基本都是使用require引用,圖片也不例外

    • require后面的路徑跟img中src中的路徑基本相似,但有兩個比較重要的點

      • 同級目錄的話require的做法是在路徑前面加【./】來標識,如下圖的的引入方式為
      11.png
        <Image source={require("./img/2.png")} />
      
      • 在html中img中src的路徑是可以拼接的,但rn中使用require引入圖片的話路徑目前是不可拼接的。比如如下的兩種寫法就會報錯

        var imgSrc = "./img/2.png";
         //錯誤示范1
        <Image source={require(imgSrc )}>
        //錯誤示范2
        var imgName = "2.png";
        <Image source={require("./img/"+imgName)}>
        
    • React Native的Packager會根據平臺選擇相應的文件,例如:my_icon.ios.png和my_icon.android.png兩個文件,加載時會根據平臺選擇相應的文件

  • 從Android或iOS項目中加載圖片
    <View>
       <Image source={{uri:"1.jpg"}) style={{width:50,height:50}}}
    </View>
    
    • 必須將圖片放到iOS項目中的asset文件夾或者Android drawable文件夾(如果不知道這兩個文件,自行百度),當項目在iOS端運行時會自動加載asset中的圖片,在android端運行時會自動加載drawable中的圖片
  • 加載來自網絡的圖片

    跟加載iOS項目和android項目中圖片的方式一樣,只不過,加載網絡中的圖片時,需要指定一下圖片的尺寸

    <Image source={{uri:'https://www.baidu.com/img/bd_logo1.png'}} style={{width:200, height:100}}/>
    
  • 注意

當你在android和iOS項目中增加圖片后,僅僅reload, 圖片是無法顯示的,你必須要重新安裝這個軟件

  • Image組件常用屬性
    • onLayout(function)

      當Image布局發生改變時,會調用該方法

    • onload(function)

      當圖片加載成功之后,回調該方法

  • onloadEnd(function)

    當圖片加載完成回調該方法,不會管圖片加載成功還是失敗

  • onloadStart(function)

    當圖片開始加載時調用該方法

  • resizeMode

    Image.resizeMode.cover:   圖片居中顯示,沒有被拉伸,超出部分被截斷;
    Image.resizeMode.contain: 容器完全容納圖片,圖片等比例進拉伸;
    Image.resizeMode.stretch: 圖片被拉伸適應容器大小,有可能會發生變形
    
  • source

    進行標記圖片的引用,該參數可以作為一個網絡url地址或者一個本地的路徑

二、九宮格案例

  • 這個案例基本將我們之前學習的內容都給復習了。如果能獨立敲出來,你就可以信心飽滿的進行下一步的學習,如果不能獨立敲出來,建議你多看著敲幾遍,把RN的編程方式熟爛于心,再進行下一步的學習,開始之前先看一下我們要做的效果
九宮格效果圖
  • 準備工作

  1. 將source文件夾中的BadgeData.json文件放到跟index.android.js同級的目錄里

  2. 將source中的圖片放到android的drawable文件夾和iOS的asset文件夾, 點擊創建drawable文件夾,iOS的自行百度

  3. 在index.android.js的同級目錄下新建一個js文件,統一取名為index.main.js

  • 編碼思路

    1. 看圖我們可以大概得出這個項目的UI結構如下

      最底下的白色背景是一個全屏的View,每個灰色的色塊是一個小View,小View里面又包含了一個Image和Text.

    2. 界面出來以后,我們在大概的看一下json數據結構,不懂json自行百度,UI和數據都有了,接下來我們開始編碼

      json結構
  1. 具體代碼

    index.main.js

      import React, { Component } from 'react';
      import {
          AppRegistry, 
          StyleSheet,  
          Text,        
          View,         
          Image
      } from 'react-native';
    
      /*設置一些全局變量*/
    
      //獲取設備的寬
      var dimensions = require("Dimensions");
      var width = dimensions.get("window").width;
    
      //設置每行3列
      var cols = 3;
    
      //每個小View的寬
      var boxW = 100;
    
      //計算每個View的間距
      var vMargin = (width-cols*boxW)/(cols+1);
    
      /*引入json數據
    
         A: 這里將json文件給引入了,我怎么去看變量badgeData里面的內容到底是什么呢?
    
         Q:   1. 直接console.log()
              2. andorid手機搖一搖手機,點擊Debug JS Remotely,此時會在PC端自動給給打開一個網站(http://localhost:8081/debugger-ui),點開控制臺即可看到你輸出的內容,在這里會將json文件的內容轉化成對象輸出到控制臺
    
      */
       var badgeDate = require("./BadgeData.json");
       console.log(badgeDate); 
    
      var MyRn = React.createClass({
    
            render() {
    
                 return (
    
                      //這個View是全屏的View,具體樣式看container
                      <View style={styles.container}>
    
                           /*函數renderAllBadge返回一個數組,該數組里放著每一個小View
    
                            * 提醒:
                            * 
                            *  1. 目前我們是在組件對象MyRn中的render()函數里,renderAllBadge是組件對象MyRn里面的一個函數
                            *
                            *  2. this指代的就是當前組件對象,這里跟js里面函數的用法一致
                            *
                            */
                           {this.rederAllBadge()}
                      </View>
    
                 );
           },
    
          rederAllBadge(){
    
             //這個數組里存放我們準備好的每個小View,最終要作為這個函數的返回值返回
           var allData = [];
    
             //通過for循環來取出來每個小View的數據
           for(var i=0;i<badgeDate.data.length;i++){
    
              var badge = badgeDate.data[i];
    
                      //每次循環以后,將準備好的View放到數組allData中
                   allData.push(
                          //通過key來標識每一個小View
                          <View key={i} style={styles.outViewStyle}>            
                              <Image source={{uri:badge.icon}}  style={styles.imageStyle}/>
                              <Text style={styles.textStyle}>{badge.title}</Text>
                          </View>       
                   );       
                }
    
                 //將allData作為返回值返回
               return allData;
    
             }
        })
    
      const styles = StyleSheet.create({
    
          container: {
    
              flex: 1,
              backgroundColor: 'white',
    
              flexDirection:"row",
              flexWrap:"wrap",
           },
    
          outViewStyle:{
    
              backgroundColor:"gray",
    
              alignItems:"center",
    
              width:boxW,
              height:boxW,
              marginLeft:vMargin,
              marginTop:vMargin
    
          },
    
          imageStyle:{
    
          width:80,
          height:80
          },
    
          textStyle:{
          fontSize:15
          }  
      });
    
      //導出自定義的組件
      module.exports = MyRn;
    
     index.android.js
    
      import {
          AppRegistry, 
    
      } from 'react-native';
    
      //導入其他文件中的組件
      var MyView =  require("./index.main.js");
    
      AppRegistry.registerComponent('myRn', () => MyView);
    
  • 注意

    1. 這個案例用到的知識點都是咱們之前學習過的,通過這個案例我告知大家一些編程小技巧,現在要慢慢熟悉這種,以后我們的案例都會是這種風格

    2. 大家沒見過的我都加注釋的,哪里有什么迷惑的,可以直接評論留言。

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

推薦閱讀更多精彩內容