ReactNative Image组件使用详解


Posted in Javascript onAugust 07, 2017

最近学习ReactNative感觉到挺有意思的,在学习的过程中,发现网上一些人写的文章内容过时了,这主要是ReactNative的版本升级太快,如果你现在看一篇16甚至15年写的文章,把知识点和官方文档对比下,会让你大跌眼镜。所以奉劝各位想学习ReactNative的同学,选择学习资料一定要以官方文档和官方demo为准,其他资料为辅。

Image组件

在ReactNative中Image是用于显示图片的组件,和开发Android的时候ImageView控件相同的效果。它可以用来显示网络图片、静态资源、临时的本地图片、以及本地磁盘上的图片(如相册)等。恰当的使用Image组件能更形象更直观的向用户传达信息。

Image组件加载项目中的静态资源

在这里的静态资源指的是加载的js部分的图片,非android,ios原生应用下的资源文件,对于加载这种图片资源,我们通过require('图片文件相对本文件目录的的路径')引入图片文件,并将其设置到Image组件的source属性即可。如下

<Image
 style={styles.image}
  //  ./表示当前文件目录 ../ 父目录
   source={require('./reactlogo.png')}
 />

需要注意的一点是,上面require中不能用字符串拼接路径,否则会加载报错。

加载原生图片资源

在此所说的原生资源指的我们开发android的时候再res目录下的drawable,或者mipmap目录。以及ios下对应的资源目录。对于加载这种图片资源和加载项目中的资源有点不一样,此处以android为例,如下加载drawable下的文件

<Image
 source={{uri: 'launcher_icon'}}
 style={{width: 38, height: 38}}
/>);

除了通过上面方式加载也可以通过下面方式

<Image
 source={nativeImageSource({
 android: 'launcher_icon',
 width: 96,
 height: 96
  })}
/>

nativeImageSource中可以指定图片宽高,如果同时在image组件的样式属性style设置宽高的话,最终宽高是以style中宽高为准。在上面默认加载的是drawable下的图片资源,如果想加载mipmap中的资源,可以如下

<Image
 source={nativeImageSource({
 android: 'mipmap/launcher_icon',
 width: 96,
 height: 96
 })}
/>

通过上面方式,我们就可以加载图片了,如果是新加到drawable下的图片需要重新编译运行,否则是不生效的。

加载网络图片

<Image
 source={{uri: 'https://facebook.github.io/react/img/logo_og.png'}}
 style={{width: 38, height: 38}}
/>);

对于加载网络图片需要注意的一点就是,需要指定样式的宽和高,否则图片将不显示(不设置默认宽和高为0了)。

Image组件常用的属性

 style:

  • width :设置图片的宽
  • height:设置图片的高
  • borderWidth:设置边框宽度
  • borderColor :设置边框颜色
  • backgroundColor:设置背景色(有些图片是透明背景时,一般会用到这个属性)
  • opacity:不透明度,值在0到1之间,1表示不透明,0表示透明。
  • tintColor :给图片着色,这个属性用处较多,如,一个黑白图片,常常会点击时变成其他颜色图片,此时可用此属性

blurRadius 设置图片的模糊半径,可模糊图片

defaultSource 给图片设置默认图片,用于加载网络成功之前显示的图片。(ios支持)

source

在上面我们介绍了source属性加载不同的图片资源,但是还有一个没讲到,它可以接收一个数组作为参数,这样可根据组件的宽和高自动加载与之匹配的宽和高的图片。使用方式如下

<Image
  style={{flex: 1}}
  source={[
       {uri: 'https://facebook.github.io/react/img/logo_small.png', width: 38, height: 38},
       {uri: 'https://facebook.github.io/react/img/logo_small_2x.png', width: 76, height: 76},     
        uri: 'https://facebook.github.io/react/img/logo_og.png', width: 400, height: 400}
      ]}
 />

resizeMode

该属性用来设置图片的缩放模式,对应值如下

  • cover:保持图片宽高比,直到宽度和高度都大于等于容器视图的尺寸(参考下图效果)
  • contain:在保持图片宽高比的前提下缩放图片,直到宽度和高度都小于等于容器视图的尺寸
  • stretch:拉伸图片且不维持宽高比,直到宽高都刚好填满容器
  • center 居中不拉伸
  • repeat:重复平铺图片直到填满容器。图片会维持原始尺寸。(iOS)

ReactNative Image组件使用详解

在Android上支持GIF和WebP格式图片

默认情况下Android是不支持GIF和WebP格式的。你需要在build.gradle文件中根据需要添加对应的依赖。

dependencies {
 // If your app supports Android versions before Ice Cream Sandwich (API level 14)
 compile 'com.facebook.fresco:animated-base-support:1.0.1'

 // For animated GIF support
 compile 'com.facebook.fresco:animated-gif:1.0.1'

 // For WebP support, including animated WebP
 compile 'com.facebook.fresco:animated-webp:1.0.1'
 compile 'com.facebook.fresco:webpsupport:1.0.1'

 // For WebP support, without animations
 compile 'com.facebook.fresco:webpsupport:1.0.1'
}

如果你在使用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);
}

ImageBackground

该组件是Image组件的扩展,它支持嵌套组件。如在图片上显示一个文本,则可以通过如下实现

<ImageBackground
        style={{width: 100, height: 100, backgroundColor: 'transparent'}}
        source={{uri: 'https://facebook.github.io/react/img/logo_og.png'}}
      >
        <Text style={styles.nestedText}>
          React
        </Text>
      </ImageBackground>

实现效果图如下,一般的我们可以嵌套ActivityIndicator来提示用户图片正在加载,当加载完成隐藏此控件。

ReactNative Image组件使用详解

网络图片加载监听

对于网络图片的加载,ReactNative提供了一些属性用于图片不同加载时期的监听。

  • onLoadStart:图片开始加载时调用
  • onLoad:图片加载完成时调用,此时图片加载成功
  • onLoadEnd:加载结束后调用,与onLoad不同的是不论成功还是失败,此回调函数都会被执行。

使用方法如下

<Image
        source={{uri:'https://facebook.github.io/react/img/logo_og.png'}}
        style={[styles.base, {overflow: 'visible'}]}
        onLoadStart={() => console.log('onLoadStart')}
        onLoad={(event) => console.log('onLoad') }
        onLoadEnd={() => console.log('onLoadEnd')}
      />

对于iOS,还提供了加载进度的回调函数onProgress

<Image
  style={styles.image}
  onProgress={(event) => {
   console.log('onProgress')
   this.setState({
    progress: Math.round(100 * event.nativeEvent.loaded / event.nativeEvent.total)
  })}}/>

可以通过参数event.nativeEvent.loaded获取已经加载的大小,通过event.nativeEvent.total获取图片的总大小。

不仅如此,ReactNative还提供了预加载图片函数prefetch(url: string),它可以将图片下载到磁盘缓存

var prefetchTask = Image.prefetch('https://facebook.github.io/react/img/logo_og.png');
prefetchTask.then(() => {
  //此处可设置状态,显示Image组件。此时组件会使用预加载的图片信息。而不用再次加载
  console.log('加载图片成功')
}, error => {
  console.log('加载图片失败')
})

好了,今天就介绍到这里,文中若有错误的地方欢迎指正,再次感谢。文中一些示例源码,可前往GitHub在线预览,也可以下载项目学习其他组件。

源码传送门

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ExtJS GTGrid 简单用户管理
Jul 01 Javascript
iframe子父页面调用js函数示例
Nov 07 Javascript
通过onmouseover选项卡实现img图片的变化
Feb 12 Javascript
原生JS实现美图瀑布流布局赏析
Sep 07 Javascript
javascript深拷贝(deepClone)详解
Aug 24 Javascript
Angular.Js的自动化测试详解
Dec 09 Javascript
微信小程序通过api接口将json数据展现到小程序示例
Jan 20 Javascript
JSON 数据详解及实例代码分析
Jan 20 Javascript
React中使用async validator进行表单验证的实例代码
Aug 17 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
Apr 17 Javascript
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
使用Ajax实现无刷新上传文件
Apr 12 Javascript
JS实现移动端判断上拉和下滑功能
Aug 07 #Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
Aug 07 #Javascript
JS判断微信扫码的方法
Aug 07 #Javascript
AngularJs每天学习之总体介绍
Aug 07 #Javascript
关于webpack2和模块打包的新手指南(小结)
Aug 07 #Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
Aug 07 #Javascript
ES6新增数据结构WeakSet的用法详解
Aug 07 #Javascript
You might like
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
2015/06/12 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
node后端服务保活的实现
2019/11/10 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python程序语言快速上手教程
2012/07/18 Python
实例讲解Python中的私有属性
2014/08/21 Python
python使用urlparse分析网址中域名的方法
2015/04/15 Python
Python实现二维有序数组查找的方法
2016/04/27 Python
PyQt5实现下载进度条效果
2018/04/19 Python
基于python绘制科赫雪花
2018/06/22 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
一套C#面试题
2013/10/09 面试题
农药学硕士毕业生自荐信
2013/09/25 职场文书
法学专业本科生自荐信范文
2013/12/17 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
网吧温馨提示
2015/07/17 职场文书