React Native组件只Image

前端之家收集整理的这篇文章主要介绍了React Native组件只Image前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

静态图片资源

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

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


混合App的图片资源

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

网络图片

在原生开发中,我们往往会去加载服务器的图片,在Rn也是支持的,我们只需要提供图片链接和大小,没办法做到自适应。
  1. // 正确
  2. <Image source={{uri: 'https://facebook.github.io/react/img/logo_og.png'}}
  3. style={{width: 400,height: 400}} />
  4.  
  5. // 错误
  6. <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

典型使用方法

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


显示图片
  1. <Image source={this.state.avatarSource} style={styles.uploadAvatar} />

如果我们只想直接打开相册或者相机。
  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控件,这里我们就需要自己去计算了(我们设置了 图片的)。

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


json数据
  1. {
  2. "data": [
  3. {"icon":"1.jpg","name":"名称一"},{"icon":"2.jpg","name":"名称二"},{"icon":"3.jpg","name":"名称三"},{"icon":"4.jpg","name":"名称四"},{"icon":"5.jpg","name":"名称五"},{"icon":"6.jpg","name":"名称六"}
  4. ]
  5. }

猜你在找的React相关文章