React-native之Image控件(9)

一. 簡(jiǎn)介

一個(gè)用于顯示多種不同類型圖片的React組件尝盼,包括網(wǎng)絡(luò)圖片吞滞、靜態(tài)資源、臨時(shí)的本地圖片盾沫、以及本地磁盤上的圖片(如相冊(cè))等裁赠。
從0.14版本開(kāi)始,React Native提供了一個(gè)統(tǒng)一的方式來(lái)管理iOS和Android應(yīng)用中的圖片赴精。要往App中添加一個(gè)靜態(tài)圖片佩捞,只需把圖片文件放在代碼文件夾比如img中某處,然后像下面這樣去引用它:
<Image source={require('./img/check.png')} />
如果你有my-icon.ios.png和my-icon.android.png蕾哟,Packager就會(huì)根據(jù)平臺(tái)而選擇不同的文件一忱。
你還可以使用@2x莲蜘,@3x這樣的文件名后綴,來(lái)為不同的屏幕精度提供圖片帘营。比如下面這樣的代碼結(jié)構(gòu):
------ button.js
------ img
------ |-------- check@2x.png
------ |-------- check@3x.p
Packager會(huì)打包所有的圖片并且依據(jù)屏幕精度提供對(duì)應(yīng)的資源票渠。譬如說(shuō),iPhone 5s會(huì)使用check@2x.png芬迄,而Nexus 5上則會(huì)使用check@3x.png庄新。如果沒(méi)有圖片恰好滿足屏幕分辨率,則會(huì)自動(dòng)選中最接近的一個(gè)圖片薯鼠。
【注意】如果你添加圖片的時(shí)候packager正在運(yùn)行择诈,可能需要重啟packager以便能正確引入新添加的圖片。為了使新的圖片資源機(jī)制正常工作出皇,require中的圖片名字必須是一個(gè)靜態(tài)字符串,不能在require中進(jìn)行拼接羞芍。
//正確
<Image source={require('./my-icon.png')} />
錯(cuò)誤
var icon = this.props.active ? 'my-icon-active' : 'my-icon-inactive';
<Image source={require('./' + icon + '.png')} />

使用混合App的圖片資源

如果你在編寫一個(gè)混合App(一部分UI使用React Native,而另一部分使用平臺(tái)原生代碼)郊艘,也可以使用已經(jīng)打包到App中的圖片資源(通過(guò)Xcode的asset類目或者Android的drawable文件夾打包):
<Image source={{uri: 'app_icon'}} style={{width: 40, height: 40}} />
注意:這一做法并沒(méi)有任何安全檢查荷科。你需要自己確保圖片在應(yīng)用中確實(shí)存在,而且還需要指定尺寸纱注。

加載網(wǎng)絡(luò)圖片

與靜態(tài)資源不同的是畏浆,你需要手動(dòng)指定圖片的尺寸。
//正確
<Image source={{uri: 'https://facebook.github.io/react/img/logo_og.png'}} style={{width: 400, height: 400}} />
//錯(cuò)誤
<Image source={{uri: 'https://facebook.github.io/react/img/logo_og.png'}} />

為什么不在所有情況下都指定尺寸呢

在瀏覽器中狞贱,如果你不給圖片指定尺寸刻获,那么瀏覽器會(huì)首先渲染一個(gè)0x0大小的元素占位,然后下載圖片瞎嬉,在下載完成后再基于正確的尺寸來(lái)渲染圖片蝎毡。這樣做的最大問(wèn)題是UI會(huì)在圖片加載的過(guò)程中上下跳動(dòng),使得用戶體驗(yàn)非常糟糕氧枣。
在React Native中有意避免了這一行為沐兵。如此一來(lái)開(kāi)發(fā)者就需要做更多工作來(lái)提前知曉遠(yuǎn)程圖片的尺寸(或?qū)捀弑龋覀兿嘈胚@樣可以帶來(lái)更好的用戶體驗(yàn)便监。然而扎谎,從已經(jīng)打包好的應(yīng)用資源文件中讀取圖片(使用require('image!x')語(yǔ)法)則無(wú)需指定尺寸,因?yàn)樗鼈兊某叽缭诩虞d時(shí)就可以立刻知道烧董。
比如這樣一個(gè)引用require('image!logo')的實(shí)際輸出結(jié)果可能是:
{"__packager_asset":true,"isStatic":true,"path":"/Users/react/HelloWorld/iOS/Images.xcassets/react.imageset/logo.png","uri":"logo","width":591,"height":573}

通過(guò)嵌套實(shí)現(xiàn)背景圖片

類似web中的背景圖(background-image)毁靶,只需簡(jiǎn)單地創(chuàng)建一個(gè)<Image>組件,然后把需要背景圖的子組件嵌入其中即可
return ( <Image source={...}> <Text>Inside</Text> </Image> );

在Android 上支持GIF和WebP格式的圖片

dependencies {
// 如果你需要支持Android4.0(API level 14)之前的版本
compile 'com.facebook.fresco:animated-base-support:0.11.0'

// 如果你需要支持GIF動(dòng)圖
compile 'com.facebook.fresco:animated-gif:0.11.0'

// 如果你需要支持WebP格式解藻,包括WebP動(dòng)圖
compile 'com.facebook.fresco:animated-webp:0.11.0'
compile 'com.facebook.fresco:webpsupport:0.11.0'

// 如果只需要支持WebP格式而不需要?jiǎng)訄D
compile 'com.facebook.fresco:webpsupport:0.11.0'
}
如果你在使用GIF的同時(shí)還使用了ProGuard老充,那么需要在proguard-rules.pro中添加如下規(guī)則 :
-keep class com.facebook.imagepipeline.animated.factory.AnimatedFactoryImpl { public AnimatedFactoryImpl(com.facebook.imagepipeline.bitmaps.PlatformBitmapFactory, com.facebook.imagepipeline.core.ExecutorSupplier); }

二. 屬性

1.onLayout (function) 當(dāng)Image布局發(fā)生改變的葡盗,會(huì)進(jìn)行調(diào)用該方法螟左,調(diào)用的代碼為:
{nativeEvent: {layout: {x, y, width, height}}}.
2.onLoad (function):當(dāng)圖片加載成功之后啡浊,回調(diào)該方法
3.onLoadEnd (function):當(dāng)圖片加載失敗回調(diào)該方法,不會(huì)管圖片加載成功還是失敗
4.onLoadStart (fcuntion):當(dāng)圖片開(kāi)始加載的時(shí)候調(diào)用該方法
5.resizeMode 縮放比例,可選參數(shù)('cover', 'contain', 'stretch') 當(dāng)圖片的尺寸超過(guò)布局的尺寸的時(shí)候胶背,會(huì)根據(jù)設(shè)置Mode進(jìn)行縮放或者裁剪圖片
cover: 在保持圖片寬高比的前提下縮放圖片巷嚣,直到寬度和高度都大于等于容器視圖的尺寸(如果容器有padding內(nèi)襯的話,則相應(yīng)減去)钳吟。譯注:這樣圖片完全覆蓋甚至超出容器廷粒,容器中不留任何空白。
contain: 在保持圖片寬高比的前提下縮放圖片红且,直到寬度和高度都小于等于容器視圖的尺寸(如果容器有padding內(nèi)襯的話坝茎,則相應(yīng)減去)。譯注:這樣圖片完全被包裹在容器中暇番,容器中可能留有空白
stretch: 拉伸圖片且不維持寬高比嗤放,直到寬高都剛好填滿容器。
repeat: 重復(fù)平鋪圖片直到填滿容器壁酬。圖片會(huì)維持原始尺寸次酌。僅iOS可用。
center: 居中不拉伸舆乔。
6.source {uri:string} 進(jìn)行標(biāo)記圖片的引用岳服,該參數(shù)可以為一個(gè)網(wǎng)絡(luò)url地址或者一個(gè)本地(使用require(相對(duì)路徑)來(lái)引用)的路徑

三. 樣式風(fēng)格

1.FlexBox 支持彈性盒子風(fēng)格
2.Transforms 支持屬性動(dòng)畫 3.resizeMode 設(shè)置縮放模式
4.backgroundColor 背景顏色
5.borderColor 邊框顏色 6.borderWidth 邊框?qū)挾?br> 7.borderRadius 邊框圓角
8.overflow 設(shè)置圖片尺寸超過(guò)容器可以設(shè)置顯示或者隱藏('visible','hidden')
9.tintColor 顏色設(shè)置 10.opacity 設(shè)置不透明度0.0(透明)-1.0(完全不透明)

四. 示例

加載網(wǎng)路圖片的例子
class MyImageDemo extends Component { render() { return ( <View style={[styles.flex,{marginTop:45}]}> <MyImage imgs={imgs}> </MyImage> </View> ); } }
class MyImage extends Component { constructor(props) { super(props); this.state = { count: 0,//圖片索引 imgs: this.props.imgs, }; }
render() { return ( <View style={[styles.flex,{alignItems:'center'}]}> <View style={styles.image}> <Image style={styles.img} resizeMode='contain' source={{uri:this.state.imgs[this.state.count]}}/> </View> <View style={styles.btns}> <TouchableOpacity onPress={this.onPrevious.bind(this)}><View style={styles.btn}><Text>上一張</Text></View></TouchableOpacity>
<TouchableOpacity onPress={this.onNext.bind(this)}><View style={styles.btn}><Text>下一張</Text></View></TouchableOpacity> </View> </View> ); }
onPrevious() { var count = this.state.count; count--; if (count >= 0) { this.setState({ count: count, }); } } onNext() { var count = this.state.count; count++; if (count < this.state.imgs.length) { this.setState({ count: count, }); } } }
const styles = StyleSheet.create({ flex: { flex: 1, }, image: { width: 300, height: 200, borderWidth: 1, justifyContent: 'center', alignItems: 'center', borderColor: '#ccc', borderRadius: 5, }, img: { width: 200, height: 150, }, btn: { width: 60, height: 35, borderWidth: 1, borderColor: '#ccc', borderRadius: 3, justifyContent: 'center', alignItems: 'center', marginRight: 30, }, btns: { flexDirection: 'row', marginTop: 20, justifyContent: 'center' } } );

效果

Image_first.jpeg

點(diǎn)擊下一張

Image_second.jpeg

點(diǎn)擊下一張

Image_third.jpeg

記錄我自己的RN學(xué)習(xí)之路,純屬自己增值希俩,有什么不對(duì)的地方吊宋,一起討論進(jìn)步

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市颜武,隨后出現(xiàn)的幾起案子贫母,更是在濱河造成了極大的恐慌,老刑警劉巖盒刚,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腺劣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡因块,警方通過(guò)查閱死者的電腦和手機(jī)橘原,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)涡上,“玉大人趾断,你說(shuō)我怎么就攤上這事》岳ⅲ” “怎么了芋酌?”我有些...
    開(kāi)封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)雁佳。 經(jīng)常有香客問(wèn)我脐帝,道長(zhǎng)同云,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任堵腹,我火速辦了婚禮炸站,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疚顷。我一直安慰自己旱易,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布腿堤。 她就那樣靜靜地躺著阀坏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笆檀。 梳的紋絲不亂的頭發(fā)上全释,一...
    開(kāi)封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音误债,去河邊找鬼浸船。 笑死,一個(gè)胖子當(dāng)著我的面吹牛寝蹈,可吹牛的內(nèi)容都是我干的李命。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼箫老,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼封字!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起耍鬓,我...
    開(kāi)封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阔籽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后牲蜀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體笆制,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年涣达,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了在辆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡度苔,死狀恐怖匆篓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寇窑,我是刑警寧澤鸦概,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站甩骏,受9級(jí)特大地震影響窗市,放射性物質(zhì)發(fā)生泄漏先慷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一谨设、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缎浇,春花似錦扎拣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至指厌,卻和暖如春刊愚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背踩验。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工鸥诽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箕憾。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓牡借,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親袭异。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钠龙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容