React-native 中Image控制項@

来源:http://www.cnblogs.com/gdsblog/archive/2017/06/28/7091287.html
-Advertisement-
Play Games

一. 簡介 一個用於顯示多種不同類型圖片的React組件,包括網路圖片、靜態資源、臨時的本地圖片、以及本地磁碟上的圖片(如相冊)等。從0.14版本開始,React Native提供了一個統一的方式來管理iOS和Android應用中的圖片。要往App中添加一個靜態圖片,只需把圖片文件放在代碼文件夾比如 ...


一. 簡介

一個用於顯示多種不同類型圖片的React組件,包括網路圖片、靜態資源、臨時的本地圖片、以及本地磁碟上的圖片(如相冊)等。
從0.14版本開始,React Native提供了一個統一的方式來管理iOS和Android應用中的圖片。要往App中添加一個靜態圖片,只需把圖片文件放在代碼文件夾比如img中某處,然後像下麵這樣去引用它:
<Image source={require('./img/check.png')} />
如果你有my-icon.ios.png和my-icon.android.png,Packager就會根據平臺而選擇不同的文件。
你還可以使用@2x,@3x這樣的文件名尾碼,來為不同的屏幕精度提供圖片。比如下麵這樣的代碼結構:
------ button.js
------ img
------ |-------- [email protected]
------ |-------- [email protected]
Packager會打包所有的圖片並且依據屏幕精度提供對應的資源。譬如說,iPhone 5s會使用[email protected],而Nexus 5上則會使用[email protected]。如果沒有圖片恰好滿足屏幕解析度,則會自動選中最接近的一個圖片。
【註意】如果你添加圖片的時候packager正在運行,可能需要重啟packager以便能正確引入新添加的圖片。為了使新的圖片資源機制正常工作,require中的圖片名字必須是一個靜態字元串,不能在require中進行拼接。
//正確
<Image source={require('./my-icon.png')} />
錯誤
var icon = this.props.active ? 'my-icon-active' : 'my-icon-inactive';
<Image source={require('./' + icon + '.png')} />

使用混合App的圖片資源

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

載入網路圖片

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

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

在瀏覽器中,如果你不給圖片指定尺寸,那麼瀏覽器會首先渲染一個0x0大小的元素占位,然後下載圖片,在下載完成後再基於正確的尺寸來渲染圖片。這樣做的最大問題是UI會在圖片載入的過程中上下跳動,使得用戶體驗非常糟糕。
在React Native中有意避免了這一行為。如此一來開發者就需要做更多工作來提前知曉遠程圖片的尺寸(或寬高比),但我們相信這樣可以帶來更好的用戶體驗。然而,從已經打包好的應用資源文件中讀取圖片(使用require('image!x')語法)則無需指定尺寸,因為它們的尺寸在載入時就可以立刻知道。
比如這樣一個引用require('image!logo')的實際輸出結果可能是:
{"__packager_asset":true,"isStatic":true,"path":"/Users/react/HelloWorld/iOS/Images.xcassets/react.imageset/logo.png","uri":"logo","width":591,"height":573}

通過嵌套實現背景圖片

類似web中的背景圖(background-image),只需簡單地創建一個<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動圖
compile 'com.facebook.fresco:animated-gif:0.11.0'

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

// 如果只需要支持WebP格式而不需要動圖
compile 'com.facebook.fresco:webpsupport:0.11.0'
}
如果你在使用GIF的同時還使用了ProGuard,那麼需要在proguard-rules.pro中添加如下規則 :
-keep class com.facebook.imagepipeline.animated.factory.AnimatedFactoryImpl { public AnimatedFactoryImpl(com.facebook.imagepipeline.bitmaps.PlatformBitmapFactory, com.facebook.imagepipeline.core.ExecutorSupplier); }

二. 屬性

1.onLayout (function) 當Image佈局發生改變的,會進行調用該方法,調用的代碼為:
{nativeEvent: {layout: {x, y, width, height}}}.
2.onLoad (function):當圖片載入成功之後,回調該方法
3.onLoadEnd (function):當圖片載入失敗回調該方法,不會管圖片載入成功還是失敗
4.onLoadStart (fcuntion):當圖片開始載入的時候調用該方法
5.resizeMode 縮放比例,可選參數('cover', 'contain', 'stretch') 當圖片的尺寸超過佈局的尺寸的時候,會根據設置Mode進行縮放或者裁剪圖片
cover: 在保持圖片寬高比的前提下縮放圖片,直到寬度和高度都大於等於容器視圖的尺寸(如果容器有padding內襯的話,則相應減去)。譯註:這樣圖片完全覆蓋甚至超出容器,容器中不留任何空白。
contain: 在保持圖片寬高比的前提下縮放圖片,直到寬度和高度都小於等於容器視圖的尺寸(如果容器有padding內襯的話,則相應減去)。譯註:這樣圖片完全被包裹在容器中,容器中可能留有空白
stretch: 拉伸圖片且不維持寬高比,直到寬高都剛好填滿容器。
repeat: 重覆平鋪圖片直到填滿容器。圖片會維持原始尺寸。僅iOS可用。
center: 居中不拉伸。
6.source {uri:string} 進行標記圖片的引用,該參數可以為一個網路url地址或者一個本地(使用require(相對路徑)來引用)的路徑

三. 樣式風格

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

四. 示例

載入網路圖片的例子
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


點擊下一張


Image_second.jpeg


點擊下一張


Image_third.jpeg

記錄我自己的RN學習之路,純屬自己增值,有什麼不對的地方,一起討論進步


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 概述 1.什麼是UML? Unified Modeling Language,統一建模語言,用圖形化的語言展示事物的結構,為交流與開發提供了便利。 2.UML分類 UML圖形主要有用例圖、類圖、順序圖、狀態圖、活動圖。不同的視圖從不同的角度反映系統的特征。 二 用例圖 Use Case Diag ...
  • 學過前端開發的地球人應該都瞭解,JavaScript分為三個部分:ECMAScript(JS語言本身基礎語法),DOM(文檔對象模型,應用程式編程介面),BOM(瀏覽器對象模型)。 BOM,實際上與瀏覽器有關係。因此瀏覽器廠商可以按照各自的想法隨意去擴展(基於window對象的擴展)。不過,擴展歸擴 ...
  • <meta charset="utf-8">告訴瀏覽器要用utf-8來解釋,同時,保存文檔時,編碼格式也要為utf-8格式。 ...
  • rem由來:font size of the root element,那麼rem是個單位,單位大小由它第一代老祖宗的font-size的大小決定。現在前端碼農們為了能在各個屏幕上看到一個健康的網頁在默默的犧牲著自己的健康,因為不僅要知道rem是個單位,更重要的是要知道怎麼能在不同解析度下呈現的頁面 ...
  • 在圖片比較多的網站總會看見,當瀏覽到那個位置,就載入那的圖片。 ...
  • 簡介 貝塞爾曲線是可以做出很多複雜的效果來的,比如彈跳球的複雜動畫效果,首先加速下降,停止,然後彈起時逐漸減速的效果。 使用貝塞爾曲線常用的兩個網址如下: 緩動函數:http://www.xuanfengge.com/easeing/easeing/ cubic-bezier:http://cubi ...
  • 1.如何使用vuex來保存數據(需要傳參的情況下) 實例說明:登錄->緩存用戶信息->跳轉到首頁->從state獲取用戶信息顯示在頁面上 step1: 新建store.js作為初始化vuex的主文件,可在裡面創建state對象,緩存數據欄位,初始化vuex, 目錄結構如下: store.js代碼如下 ...
  • 如果你是一個人在自學前端開發,或者是對前端開發有比較濃厚的興趣正想踏入前端領域,只要你在前端自學路上遇到了自己無法解決的技術難題,那麼儘管將你的疑惑交給我的小伙伴兒們吧,我們都是一群在前端自學路上摸爬滾打的有志青年,希望你可以來和我們共同交流。同時也希望你能獻出自己的一份力,幫助我的小伙伴兒們解決他 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...