博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从零学React Native之08Image组件
阅读量:6371 次
发布时间:2019-06-23

本文共 3160 字,大约阅读时间需要 10 分钟。

开发过程中, 几乎每个项目都会用到图片. 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            
); }}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            
); }}复制代码

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

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

var imageAddress = './image/big_star.png'; //运行阶段赋值  class AwesomeProject extends Component {    //require 在编辑阶段就会处理     render() {        return (            //根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            
); }}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控件无法实现等比放大后无丢失显示,我们需要自定义区实现,大家可以参考我的另一篇文章

其它样式

虽然Image组件不是从View组件继承而来的,但是它支持了绝大多数View中的样式键,除了这些还有额外的一些.

  1. tintColor是IOS平台专有属性,颜色类型,可以让图片中的非透明像素部分有一种被染色的效果.
  2. overlayColor是Android平台的专有属性,颜色类型. Android平台在某些特殊情况无法通过borderRadius实现圆角效果,这时需要使用overlayColor属性,强行将需要圆角的部分使用指定的颜色填充, 从而实现圆角效果.

回调函数

Image也支持onLayout回调函数,与View组件的onLayout函数类似 当我们通过Image组件加载网络图片时, 可以设置onLoadStart,onLoadEnd,onLoad三个属性来指定在开始读取与读取结束时所需要进行的函数处理. onLoad只有成功读取图片调用, 而onLoadEnd无论成功与失败,都会调用。

更多精彩请关注微信公众账号likeDev,公众账号名称:爱上Android。

转载地址:http://hdyqa.baihongyu.com/

你可能感兴趣的文章
XAMPP软件包下载
查看>>
XXL-JOB初体验-ORACLE版
查看>>
沉思录:别人的棺材
查看>>
jersey + spring + mybatis + redis项目搭建
查看>>
PAT 1006 部分正确_另一种解法
查看>>
在Keil环境下使用JLink实现printf输出重定向至debug窗口
查看>>
postgres的\d命令不显示全部的用户表
查看>>
poj 3468 A Simple Problem with Integers
查看>>
OOA/OOD/OOP细讲
查看>>
Tomcat 系统架构与设计模式_ 设计模式分析
查看>>
Quartz的使用
查看>>
Spring Boot Quartz集成(一)
查看>>
IP子网划分
查看>>
海哥:再谈粉丝经济,你所知道的99%都是错误的。
查看>>
内涵图让你读懂社会
查看>>
awk学习笔记
查看>>
Spring 学习之bean的理解
查看>>
【不定期更新】游戏开发中的一些良好习惯与技术技巧
查看>>
DNS的初步了解
查看>>
多线程核对MD5码脚本
查看>>