React Native组件只Image

不管在Android还是在iOS原生的开发中,图片都是作为控件给出来的,在RN中也有这么一个控件(Image)。根据官网的资料,图片分为本地静态图片,网络图片和混合app资源。一下分类介绍来源官网。

静态图片资源

从0.14版本开始,React Native提供了一个统一的方式来管理iOS和Android应用中的图片。要往App中添加一个静态图片,只需把图片文件放在代码文件夹中某处,然后像下面这样去引用它:
<Image source={require('./my-icon.png')} />
图片文件的查找会和JS模块的查找方式一样。在上面的这个例子里,是哪个组件引用了这个图片,Packager就会去这个组件所在的文件夹下查找my-icon.png。并且,如果你有my-icon.ios.png和my-icon.android.png,Packager就会根据平台而选择不同的文件。二对于ios还可能有2倍图和3倍图的区分。
├── button.js
└── img
    ├── check@2x.png
    └── check@3x.png

Packager会打包所有的图片并且依据屏幕精度提供对应的资源。譬如说,iPhone 5s会使用check@2x.png,而Nexus 5上则会使用check@3x.png。如果没有图片恰好满足屏幕分辨率,则会自动选中最接近的一个图片。
注意:为了使新的图片资源机制正常工作,require中的图片名字必须是一个静态字符串。
// 正确
<Image source={require('./my-icon.png')} />

// 错误
var icon = this.props.active ? 'my-icon-active' : 'my-icon-inactive';
<Image source={require('./' + icon + '.png')} />

// 正确
var icon = this.props.active ? require('./my-icon-active.png') : require('./my-icon-inactive.png');
<Image source={icon} />


混合App的图片资源

如果你在编写一个混合App,也可以使用已经打包到App中的图片资源,系统会自动检索。
<Image source={{uri: 'app_icon'}} style={{width: 40, height: 40}} />

网络图片

在原生开发中,我们往往会去加载服务器的图片,在Rn也是支持的,我们只需要提供图片的链接和大小,没办法做到自适应。
// 正确
<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'}} />

加载本地图库图片

CameraRoll模块提供了访问本地相册的功能。

static saveImageWithTag(tag)   保存一个图片到相册。

@param {string} tag 在安卓上,本参数是一个本地URI,例如"file:///sdcard/img.png".
在iOS设备上可能是以下之一:
本地URI
资源库的标签
非以上两种类型,表示图片数据将会存储在内存中(并且在本进程持续的时候一直会占用内存)。
返回一个Promise,操作成功时返回新的URI。

static getPhotos(params: object) 获取图片

返回一个带有图片标识符对象的Promise。返回的对象的结构参见getPhotosReturnChecker。
@param {object} 要求的参数结构参见getPhotosParamChecker.
返回一个Promise,操作成功时返回符合getPhotosReturnChecker结构的对象。

不过网上提供了第三方的组件react-native-image-picker,这个组件同时支持photo和video,也就是照片和视频都可以用。我们使用npm安装这个组件:
npm install --save react-native-image-picker

典型使用方法

[objc]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. import ImagePickerManager from 'NativeModules';  
  2.    
  3.  当你想展示相机还是相册这个选择器时:(变量options还有其它的设置,一些使用它的默认值就可以满足我们的要求,以下是我使用到的)  
  4. var options = {  
  5.   title'Select Avatar'// 选择器的标题,可以设置为空来不显示标题  
  6.   cancelButtonTitle'Cancel',  
  7.   takePhotoButtonTitle'Take Photo...'// 调取摄像头的按钮,可以设置为空使用户不可选择拍照  
  8.   chooseFromLibraryButtonTitle'Choose from Library...'// 调取相册的按钮,可以设置为空使用户不可选择相册照片  
  9.   customButtons: {  
  10.     'Choose Photo from Facebook''fb'// [按钮文字] : [当选择这个按钮时返回的字符串]  
  11.   },  
  12.   mediaType'photo'// 'photo' or 'video'  
  13.   videoQuality'high'// 'low', 'medium', or 'high'  
  14.   durationLimit10// video recording max time in seconds  
  15.   maxWidth100// photos only默认为手机屏幕的宽,高与宽一样,为正方形照片  
  16.   maxHeight100// photos only  
  17.   allowsEditingfalse// 当用户选择过照片之后是否允许再次编辑图片  
  18. };  
  19.    
  20. ImagePickerManager.showImagePicker(options, (response) => {  
  21.   console.log('Response = ', response);  
  22.   
  23.   if (response.didCancel) {  
  24.     console.log('User cancelled image picker');  
  25.   }  
  26.   else if (response.error) {  
  27.     console.log('ImagePickerManager Error: ', response.error);  
  28.   }  
  29.   else if (response.customButton) {  
  30.     // 这是当用户选择customButtons自定义的按钮时,才执行  
  31.     console.log('User tapped custom button: ', response.customButton);  
  32.   }  
  33.   else {  
  34.     // You can display the image using either data:  
  35.   
  36.     if (Platform.OS === 'android') {  
  37.         source = {uri: response.uri, isStatictrue};  
  38.     } else {  
  39.         source = {  
  40.             uri: response.uri.replace('file://'''),  
  41.             isStatictrue  
  42.         };  
  43.     }  
  44.   
  45.     this.setState({  
  46.       avatarSource: source  
  47.     });  
  48.   }  
  49. });  


显示图片:
[objc]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <Image source={this.state.avatarSource} style={styles.uploadAvatar} />  

如果我们只想直接打开相册或者相机。
[objc]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. // Launch Camera:  
  2.   ImagePickerManager.ImagePickerManager.launchCamera(options, (response)  => {  
  3.     // Same code as in above section!  
  4.   });  
  5.   
  6.   // Open Image Library:  
  7.   ImagePickerManager.ImagePickerManager.launchImageLibrary(options, (response)  => {  
  8.     // Same code as in above section!  
  9.   });  

复杂功能介绍

我们现在有个需求,就是实现GridView网格的效果,那么怎么做呢?Rn是没有直接给我提供Grid控件的,但是有ListView控件,这里我们就需要自己去计算了(我们设置了 图片的)。

[objc]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. import React, { Component } from 'react';  
  2. import {  
  3.   AppRegistry,  
  4.   StyleSheet,  
  5.   Text,  
  6.   View,  
  7.   Image  
  8. } from 'react-native';  
  9.   
  10. // 导入JSON数据  
  11. var productData = require('./productData.json');  
  12. var Dimensions = require('Dimensions');  
  13. var screenW = Dimensions.get('window').width;  
  14.   
  15. // 定义一些全局的变量  
  16. var cols = 3;  
  17. var boxW = 100;  
  18. var vMargin = (screenW - cols * boxW) / (cols + 1);  
  19. var hMargin = 20;  
  20.   
  21. class ImageDemo extends Component {  
  22.   render() {  
  23.     return (  
  24.       <View style={styles.container}>  
  25.         {/*返回商品列表*/}  
  26.         {this.renderAllProduct()}  
  27.       </View>  
  28.     );  
  29.   }  
  30.   
  31.   // 返回商品列表  
  32.   renderAllProduct() {  
  33.     // 定义数组装所有子组件  
  34.     var allProduct = [];  
  35.     console.log(productData.data.length);  
  36.     // 遍历json数据  
  37.     for(var i=0;i<productData.data.length;i++){  
  38.       // 取出单个商品数据对象  
  39.       var product = productData.data[i];  
  40.       // 装入数组  
  41.       allProduct.push(  
  42.           <View key={i} style={styles.outViewStyle}>  
  43.             <Image source={{uri:product.icon}} style={styles.iconStyle}/>  
  44.             <Text style={styles.nameStyle}>{product.name}</Text>  
  45.           </View>  
  46.       );  
  47.     }  
  48.   
  49.     // 最后要返回数组  
  50.     return allProduct;  
  51.   }  
  52.   
  53. }  
  54.   
  55.   
  56.   
  57. const styles = StyleSheet.create({  
  58.   container: {  
  59.     flex1,  
  60.     backgroundColor'#F5FCFF',  
  61.     marginTop:20,  
  62.     // 设置主轴的方向  
  63.     flexDirection:'row',  
  64.     // 换行显示  
  65.     flexWrap:'wrap'  
  66.   },  
  67.   outViewStyle:{  
  68.     backgroundColor:'grey',  
  69.     // 设置侧轴对齐方式  
  70.     alignItems:'center',  
  71.     width:boxW,  
  72.     height:boxW,  
  73.     marginLeft:vMargin,  
  74.     marginBottom:hMargin  
  75.   },  
  76.   iconStyle:{  
  77.     width:80,  
  78.     height:80  
  79.   },  
  80.   nameStyle:{  
  81.     alignItems:'center',  
  82.     // 文字颜色  
  83.     color:"#fff"  
  84.   }  
  85. });  
  86.   
  87. AppRegistry.registerComponent('ImageDemo', () => ImageDemo);  


json数据
[javascript]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. {  
  2.   "data": [  
  3.     {"icon":"1.jpg""name":"名称一"},  
  4.     {"icon":"2.jpg""name":"名称二"},  
  5.     {"icon":"3.jpg""name":"名称三"},  
  6.     {"icon":"4.jpg""name":"名称四"},  
  7.     {"icon":"5.jpg""name":"名称五"},  
  8.     {"icon":"6.jpg""name":"名称六"}  
  9.   ]  
  10. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值