開發過程當中, 幾乎每一個項目都會用到圖片.
RN就是經過Image組件顯示圖片。既能夠加載網絡圖片,也能夠加載本地資源圖片。
Image組件必須在樣式中聲明圖片的款和高。若是沒有聲明,則圖片將不會被呈如今界面上。php
加載網絡圖片很是簡單, 直接上代碼:
修改index.ios.js或者inde.android.jsreact
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
View,
Image
} from 'react-native';
var imageAddress = 'http://qq.111cn.net/uploads/allimg/140712/22020H9C-22.jpg';
class AwesomeProject extends Component {
render() {
return (
//根View
<View style={styles.container}>
<Image style={styles.imageStyle}
source={{uri:imageAddress}}/>
</View>
);
}
}
const styles = StyleSheet.create({
container: { //根View樣式
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF'
},
imageStyle: {
width:100,
height:100
}
});
AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);
運行結果:
android
在RN開發中,須要預先加載靜態的圖片資源,以下,其中須要在項目目錄下建立image文件夾, 裏面放置big_star.png。ios
class AwesomeProject extends Component {
render() {
return (
//根View
<View style={styles.container}>
<Image style={styles.imageStyle}
source={require('./image/big_star.png')}/>
</View>
);
}
}
require等同於使用了var聲明瞭一個變量,等同於在代碼頂部預先加載了圖片資源.express
注意,下面代碼運行的時候就會報錯react-native
var imageAddress = './image/big_star.png'; //運行階段賦值
class AwesomeProject extends Component {
//require 在編輯階段就會處理
render() {
return (
//根View
<View style={styles.container}>
<Image style={styles.imageStyle}
source={require({imageAddress})}/>
</View>
);
}
}
在RN開發中, 不容許使用字符串變量來指定須要預先加載的圖片的名稱.由於React Native在編譯代碼時處理全部的require聲明,還不是在運行時動態的處理,而,var在運行時賦值,因此不能動態加載圖片資源. 就會報下面的錯誤:微信
上面咱們說了,Image組件必須在樣式中聲明圖片的款和高。若是沒有聲明,則圖片將不會被呈如今界面上。
咱們通常將Image定義的寬和高乘以當前運行環境的像素密度稱爲Image的實際寬高.當Image的實際寬、高與圖片的實際寬、高不符時,視圖片樣式定義中resizeMode的取值不一樣而分爲三種狀況, 三個取值分別是: contain, cover和stretch.默認值是cover.markdown
來看下例子,修改上面的代碼,定義三個相同大小的Image控件 引入同一張圖片,指定不一樣的resizeMode。網絡
class AwesomeProject extends Component {
componentWillMount() {
//預加載靜態資源
this.image=require('./image/meinv.jpg');
}
render() {
return (
//根View
<View style={styles.container}>
<Image style={[styles.imageStyle,{resizeMode:'cover'}]}
source={this.image}/>
<Image style={[styles.imageStyle,{resizeMode:'contain'}]}
source={this.image}/>
<Image style={[styles.imageStyle,{resizeMode:'stretch'}]}
source={this.image}/>
</View>
);
}
}
const styles = StyleSheet.create({
container: { //根View樣式
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'grey'
},
imageStyle: {
width:150,
height:150,
margin:5,
backgroundColor:'white'
}
});
看看運行效果:函數
resizeMode還能夠定義在屬性上,比style中的優先級要高:
<Image style={{height:200,width:200}} resizeMode={Image.resizeMode.cover} source={this.image}/>
看到上面三個模式,能夠發現原生的Image控件沒法實現等比放大後無丟失顯示,咱們須要自定義區實現,你們能夠參考個人另外一篇文章React Native等比放大不丟失圖片
雖然Image組件不是從View組件繼承而來的,可是它支持了絕大多數View中的樣式鍵,除了這些還有額外的一些.
1. tintColor是IOS平臺專有屬性,顏色類型,可讓圖片中的非透明像素部分有一種被染色的效果.
2. overlayColor是Android平臺的專有屬性,顏色類型. Android平臺在某些特殊狀況沒法經過borderRadius實現圓角效果,這時須要使用overlayColor屬性,強行將須要圓角的部分使用指定的顏色填充, 從而實現圓角效果.
Image也支持onLayout回調函數,與View組件的onLayout函數相似
當咱們經過Image組件加載網絡圖片時, 能夠設置onLoadStart,onLoadEnd,onLoad三個屬性來指定在開始讀取與讀取結束時所須要進行的函數處理. onLoad只有成功讀取圖片調用, 而onLoadEnd不管成功與失敗,都會調用。
更多精彩請關注微信公衆帳號likeDev,公衆帳號名稱:愛上Android。