React Native基础之Image

React Native基础之Image

Image组件

       在React Native中,Image组件是用来加载图片的组件,如果学习过android的话,应该知道Image组件的作用就相当于android中的ImageView控件,用于显示图片。

Image加载图片等几种方式

       作为RN中加载图片的组件,不同于android中的ImageView,android中的ImageView仅用来加载android项目中的drawable和mipmap目录下的图片资源。

       RN项目本就是缩小了android与ios的差别,囊括了原生的android项目和ios项目,自然也就包含了原生项目中的图片资源目录,再加上RN项目中需要公共资源目录,因此,在React Native中,Image加载图片的方式出现了好几种,如下:

  • 加载RN项目中静态图片
  • 加载原生图片(android:drawable/mipmap ios:Images.xcassets目录下)
  • 加载网络图片

加载RN项目中的静态图片

<Image source={require('../img/icon_logo.png')} style={{marginTop:20}}/>

     
 加载方式为:

require('图片存放路径')

       此种方式用于加载RN项目中的静态图片(require中放的是RN项目中的图片路径)

       使用此方式加载静态图片时,图片的位置(在RN项目中,不能在android、ios、node-modules目录下)使用这一种加载图片的方式

     
 注意:

  • require函数中填写图片路径时,需要加上图片的后缀名,如上:'.png'
  • require函数中暂时不支持字符串拼接,如:require('../img/'+'icon_log.png''),如此会报异常
  • require路径的前面常有:'../'、'./'这样的,'./'表示当前目录,'../'表示当前目录的上级(父)目录
  • RN还有一个优势,RN中可以通过图片的命名方式来实现对应平台图片的加载,命名方式为:'图片名'+'.平台名'+'.后缀名',如:图片icon_logo.android.pngicon_logo.ios.png,RN会根据中间的平台名来加载对应平台的图片
  • RN实现图片适配的方式:
    • 图片命名为icon_logo@2x.pngicon_logo@3x.png的形式,RN会根据屏幕分辨率来加载对应尺寸的图片,如果没有恰好满足屏幕分辨率的,则选择最接近的
    • 该种适配方式,对与android来说,引入的时候不能将'@2x'这样的字样引入进来,如require('./img/icon_logo@2x.png'),会导致图片无法识别,正确的加载方式为require('./img/icon_logo.png')

加载原生图片

<Image source={{uri:'icon_app'}} style = {styles.icon}></Image>

const styles = StyleSheet.create({
    container:{
        flexDirection:'column',
        justifyContent:'center',
        alignItems:'center',
    },
    icon:{
        width:120,
        height:120,
    },
    text:{
        color:'black',
        fontSize:16,
        marginTop:20
    }
})

     
 所谓原生图片,android中指的是app/src/main/res/drawable目录下,ios中指的是Images.xcassets目录,或者说是打包后的apk后反编译出来的图片资源

     
 从以上代码可以看到,我们可以看到,加载方式为:

{uri:'图片名称'}

这里的图片名称不带图片的后缀名,并且没有路径,只有一个图片名称

注意:

  • 根据上面的代码,可以看到,需要指定图片的大小(width和height),不然图片无法显示,因为此加载方式不提供图片安全检查
  • 不同于上面的加载方式,使用uri的加载方式可以实现字符串拼接,解决了上面require中不能拼接的问题,因此,如果需要使用拼接来实现加载,那么只需要将图片放入原生项目对应的目录下

还有一点需要注意,就是上面的加载方式在android中默认加载的drawable目录下的图片资源,如果想加载mipmap下的图片资源,加载方式如下:

var nativeImageSource = require('nativeImageSource');
 
class RN_Image extends Component {
  render() {
    let ades = {
      android: 'mipmap/ic_launcher',
      width: 72,
      height: 72
    };
 
    return (
      <View style={styles.container}>
          <Image style={styles.image} source={nativeImageSource(ades)} />
      </View>
    );
  }
}
const styles = StyleSheet.create({
  container: {
      flex: 1,
      alignItems: 'center',
      backgroundColor: 'gray'
  },
  image: {
      backgroundColor: 'white',
      width: 120,
      height: 120,
  },
});

module.exports = RN_Image

nativeImageSource中可以指定图片的宽高,如果在image的style中同时指定了图片宽高的话,以style中的为准。

加载网络图片

<Image
    source = {{uri:'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_ca79a146.png'}}
    style={styles.icon}
    resizeMode = 'cover'></Image>

     
 加载网络图片也是通过uri的方式来加载的

{uri:'图片url'}

同上,此种方式也是需要指定图片的大小(widht和height)的

Image常用属性

source:标记图片的引用,填写图片路径或者url
+ 大方

reseizeMode:设置图片的填充模式,有三个可选值(默认值时cover)

  • cover:等比例缩放图片,超出部分不显示,使图片最短边占满组件
  • contain:等比例缩放图片,图片显示完全,即缩放到最长边占满组件
  • stretch:图片拉伸适应组件大小,图片有可能会发生变形

我们来看看三种模式的显示效果:

image

Image样式属性

  • borderColor:设置边框颜色
  • borderWidth:设置边框宽度
  • borderRadius:设置边框圆角
  • opacity:设置透明度(0~1之间,0表示透明,1表示不透明)
  • tintColor:着色,为所有非透明的像素指定一个颜色
  • backgroundColor:背景色(图片有透明背景时,可能会用到)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容