react native 实现图片预览 图片保存 react-native-image-zoom-viewer
图片 预览,和保存 功能 应该是很常见的APP 功能 。实现起来也很简单。
这里用到的组件是:https://github.com/ascoders/react-native-image-viewer
看下新效果图:
使用 :
npm i react-native-image-zoom-viewer --save
下面代码 自己稍加修改 ,拿过去就能用
import React, { Component, PropTypes } from 'react'; import { View, Text, TouchableHighlight, StyleSheet, ScrollView, ListView, Image, Modal, TouchableOpacity, Dimensions, ActivityIndicator, CameraRoll, } from 'react-native'; import ImageViewer from 'react-native-image-zoom-viewer'; const screenWidth = Dimensions.get("window").width; const screenHeight = Dimensions.get("window").height; export default class LookPhotoModal extends Component { constructor(props) { super(props); this.state = { data: this.props.data, animating: true, }; this.renderLoad = this.renderLoad.bind(this); this.savePhoto = this.savePhoto.bind(this); this._Close= this._Close.bind(this); } _Close() { this.props.cancel(); } renderLoad() { //这里是写的一个loading return ( <View style={{ marginTop: (screenHeight / 2) - 20 }}> <ActivityIndicator animating={this.state.animating} size={"large"} /> </View> ) } savePhoto() { let index = this.props.curentImage; let url = this.props.imaeDataUrl[index]; let promise = CameraRoll.saveToCameraRoll(url); promise.then(function (result) { alert("已保存到系统相册") }).catch(function (error) { alert('保存失败!\n' + error); }); } render() { let imageData = this.props.imaeDataUrl; // let IsArray = Array.isArray(this.props.imaeDataUrl) let ImageObjArray = []; for (let i = 0; i < imageData.length; i++) { let Obj = {}; Obj.url = imageData[i]; ImageObjArray.push(Obj) } return ( <View style={{ position: "absolute", top: 0, bottom: 0, left: 0, right: 0 }}> <Modal animationType={"slide"} transparent={true} visible={this.props.modalVisible} // onRequestClose={() => { this._pressSignClose() }} > <ImageViewer imageUrls={ImageObjArray} // 照片路径 enableImageZoom={true} // 是否开启手势缩放 saveToLocalByLongPress={true} //是否开启长按保存 index={this.props.curentImage} // 初始显示第几张 // failImageSource={} // 加载失败图片 loadingRender={this.renderLoad} enableSwipeDown={false} menuContext={{ "saveToLocal": "保存图片", "cancel": "取消" }} onChange={(index) => { }} // 图片切换时触发 onClick={() => { // 图片单击事件 this._Close() }} onSave={(url) => { this.savePhoto(url) }} /> </Modal> </View> ); } }
注意:这个组件的 imageUrls 必须是是个对象数组 键的值 是url.
我们在用的时候 可以 把当前点击的图片下标传过来,然后就会对应显示当前图片。
保存图片使用的是 RN 的 CameraRoll
需要注意的是:(这里详细介绍下ios的使用,因为没android机,Android的话可以先下载图片到本地,然后再保存到系统相册,待更新介绍)
saveToCameraRoll(tag, type?)方法介绍
(1)这个是 CameraRoll 的一个静态方法,作用是保存一张图片到相册。
(2)参数 tag 是图片的地址,为字符串类型。其内容根据不同的设备也有所不同:
- 在 Android 上:tag 是本地地址,例如:"file:///sdcard/img.png"
- 在 iOS 上:tag 可以是 url、assets-library、内存图片中的一种。
(3)参数 type 不是必须的,可选值是'photo' 或 'video'。用来表示存的是图片还是视频。不指定的话程序也会根据后缀自行判断。(结尾为 .mov 或 .mp4 为视频,其它为图片)
环境:
Info.plist中添加一条名为NSPhotoLibraryUsageDescription的键,然后在其值中填写向用户请求权限的具体描述。编辑完成后这个键在Xcode中实际会显示为Privacy - Photo Library Usage Description。
//添加权限 <key>NSPhotoLibraryUsageDescription</key> <string>XXX想访问您的相册</string> <key>NSCameraUsageDescription</key> <string>XXXXX想访问您的相机</string>
添加完权限之后,再把 到工程项目中的 node_module/react-native/Libraries/CameraRollC拖到我们xcode工程中,
然后在 Build Phases -> Link Binary With Libraries 里添加 libRCTCameraRoll.a 不然的话 红屏报错。
Android 保存图片请参考react native Android 图片预览 图片保存...
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
《React Native跨平台移动应用开发》读后鬼扯
别名:手把手教你学React Native 评分:3星 作者:阙喜涛 GitHub:https://github.com/es6rn (本书相关代码主页,非作者本人的) 豆瓣:https://book.douban.com/subject/26809232/ 这本书和别名写的一样,手把手教你学RN,和很多入门的书籍很相似,按照本书的章节一步一步来,肯定对RN的开发会有一定的了解。但是它也一本某些内容注定会落伍的书,因为RN还在不断的更新中,不排除会有破坏性的更新导致某些章节内容在RN最新版下是错误的,这个都是废话。 现实中,Android和iOS两大移动操作系统分庭抗礼的局面决定了注定会有类似RN这样跨平台移动开发框架的出现,只不过各家实现的思路不同而已,以ionic,RN,Flutter为代表分别扯一下。 ionic算是我的老冤家了,用它做过项目,我还写了一个入门教程 ionic3-handbook,ionic是基于Angular和Cordova的,它的原理也很简单,Angular开发打包的js代码运行在WebView中,通过Cordova插件与Native进行交互,调用原生功能。C...
- 下一篇
浅谈混合应用的演进
前端想要写 APP 开篇想以这样的方式开头,从 APP 开始火到现在,前端同学就一直想要写 APP,各方技术也是为了让前端同学写上 APP 操碎了心。 为什么要前端同学来写 APP,站在整个技术链上来看,都是在做页面呈现,页面交互,对于技术而言只是将产品在不同的端上进行呈现,所以很早之前就有提倡说大前端的概念。既然功能都差不多,就没有分家的理由。 再者,开发客户端现在的常规平台有 iOS 和 android 两个大的平台,在前端领域越来越细分的大环境下,传统意义上的客户端开发至少需要两拨开发者来做,成本就会有增加。并且伴随着成本增加还带来了需要两套体系化的语言开发,开发效率也会大打折扣。相较于两大客户端平台的开发人员,前端的开发人员是要更多的,并且随着移动端的兴起前端开发者会有资源剩余的情况,前端来写 APP 也可以平衡资源。 所以不仅仅是前端同学想要来写 APP,更多的是未来发展需要这样的技术来提高生产力,所以才会有各种各样的方案出现,各种方案的诞生也发现了前端写 APP 的不足,所以又有了不断的演进来适应未来发展。送给每一个前端人,我们的征途是星辰大海 web APP 就是我们常说...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6