开发过程中, 几乎每个项目都会用到图片.

RN就是通过Image组件显示图片。既可以加载网络图片,也可以加载本地资源图片。

Image组件必须在样式中声明图片的款和高。如果没有声明,则图片将不会被呈现在界面上。

网络图片加载

加载网络图片非常简单, 直接上代码:

修改index.ios.js或者inde.android.js

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);

运行结果:

本地图片加载

在RN开发中,需要预先加载静态的图片资源,如下,其中需要在项目目录下创建image文件夹, 里面放置big_star.png。

class AwesomeProject extends Component {
render() {
return (
//根View
<View style={styles.container}>
<Image style={styles.imageStyle}
source={require('./image/big_star.png')}/>
</View>
);
}
}

require等同于使用了var声明了一个变量,等同于在代码顶部预先加载了图片资源.

注意,下面代码运行的时候就会报错

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在运行时赋值,所以不能动态加载图片资源. 就会报下面的错误:

resizeMode

上面我们说了,Image组件必须在样式中声明图片的款和高。如果没有声明,则图片将不会被呈现在界面上。

我们一般将Image定义的宽和高乘以当前运行环境的像素密度称为Image的实际宽高.当Image的实际宽、高与图片的实际宽、高不符时,视图片样式定义中resizeMode的取值不同而分为三种情况, 三个取值分别是: contain, cover和stretch.默认值是cover.

  1. cover模式只求在显示比例不失真的情况下填充整个显示区域。可以对图片进行放大或者缩小,超出显示区域的部分不显示, 也就是说,图片可能部分会显示不了。
  2. contain模式是要求显示整张图片, 可以对它进行等比缩小, 图片会显示完整,可能会露出Image控件的底色。 如果图片宽高都小于控件宽高,则不会对图片进行放大。
  3. stretch模式不考虑保持图片原来的宽,高比.填充整个Image定义的显示区域,这种模式显示的图片可能会畸形和失真。
  4. center模式, 9月11号的0.33版本才支持,contain模式基础上支持等比放大。

来看下例子,修改上面的代码,定义三个相同大小的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。

从零学React Native之08Image组件的更多相关文章

  1. 从零学React Native之12 组件的生命周期

    一个React Native组件从它被加载,到最终被卸载会经历一个完整的生命周期.所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命周期,是合理开发的关键. ES6语法和之前的ES5 ...

  2. 从零学React Native之11 TextInput

    TextInput 组件是用来通过键盘输入文字,可以使用View组件和Text组件样式,没有自己特定的样式. 与Text组件类似,TextInput组件内部的元素不再使用FlexBox布局,而采用文本 ...

  3. 从零学React Native之03页面导航

    之前我们介绍了RN相关的知识: 是时候了解React Native了 从零学React Native之01创建第一个程序 从零学React Native之02状态机 本篇主要介绍页面导航 上一篇文章给 ...

  4. 从零学React Native之02状态机

    本篇文章首发于简书 欢迎关注 之前我们介绍了RN相关的知识: 是时候了解React Native了 从零学React Native之01创建第一个程序 本篇文章主要介绍下下面的知识: 1.简单界面的搭 ...

  5. 从零学React Native之13 持久化存储

    数据持久化就是指应用程序将某些数据存储在手机存储空间中. 借助native存储 这种方式不言而喻,就是把内容传递给native层,通过原生API存储,详见从零学React Native之05混合开发 ...

  6. 从零学React Native之04自定义对话框

    本篇主要介绍: 1. 自定义组件 2. Alert 对话框 自定义对话框 之前的我都是利用React Native提供的基础组件对它们进行排列组合, 其实自定义也很简单, 我们还是拿上一篇文章的例子进 ...

  7. 从零学React Native之10Text

    在React Native开发中,所有需要显示的字符串文本都需要放置在Text或者Text的子组件中.虽然在之前的文章中多次使用了Text组件,但是Text组件还是值得专门学习的, 并没有想象中的那么 ...

  8. 从零学React Native之07View

    View 组件是React Native最基本的组件.绝大部分其他React Native 组件. View组件的颜色和边框 backgroundColor 键用来指定颜色. RN 0.19版本开始, ...

  9. 从零学React Native之06flexbox布局

    前面我们接触了好多React Native代码, 并没有介绍RN中的组件具体是如何布局的,这一篇文章,重点介绍下flexbox布局. 什么是flexbox布局 React中引入了flexbox概念,f ...

随机推荐

  1. 斐波那契字符串_KMP

    前言:通过这道题恶补了一下字符串匹配的知识 思路:首先就是求出菲波那切字符串,这个很简单,但是要注意递归超时的问题,可以考虑加上备忘录,或者用递推法,接下来就是匹配问题了,常规的BF会超时,所以要用K ...

  2. bootstrap--栅格系统布局

    栅格布局使用例子: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---状态模式[转]

    {没有应用状态模式的代码} //工程文件 program Project1; {$APPTYPE CONSOLE} uses  uGumballMachine in 'uGumballMachine. ...

  4. mybatis深入理解(一)-----Mybatis初始化机制详解

    对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. 一. MyBatis的初始化做了什么 1.configuration ...

  5. Android中Activity的android:windowSoftInputMode属性

    转载 https://blog.csdn.net/qiutiandepaomo/article/details/84028558 windowSoftInputMode属性主要是用来设置窗口软键盘的交 ...

  6. SEO中HTML标签权重列表

    网上流传很久的一份资料<SEO中HTML标签权重>,这里做一份备份. HTML标签权重分值排列 内部链接文字:10分 标题title:10分 域名:7分 H1,H2字号标题:5分 每段首句 ...

  7. bzoj 4521 [Cqoi2016]手机号码——数位dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4521 dfs真好用~ #include<iostream> #include&l ...

  8. Android——内存管理基础

    内存收集概念 内存垃圾收集器(garbage collector) 概念:自定内存管理. 功能:分配内存.保证所有被引用的对象还在内存中.可以释放在运行的代码中不再引用的对象的内存. 垃圾收集器避免了 ...

  9. Leetcode868.Binary Gap二进制间距

    给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...

  10. 【水滴石穿】imooc_gp

    这个项目应该是一个标杆项目,看到之前很有几个项目都是按照这个项目的页面摆放顺序来的 不过可以作为自己做项目的一种方式 源码地址为:https://github.com/pgg-pgg/imooc_gp ...