react-native下载图片到本地相册

需求

点击右上角下载icon,可以将当前图片下载并保存到本地相册。
在这里插入图片描述
下载的图片:

在这里插入图片描述

流程

下载图片的本质其实是,

固定需要下载的页面内容和样式 ===》将其放在当前页面不可见区域 ===》点击下载按钮 ===》穿一个ref给native,会自动拉起手机系统下载到本地相册

todo:native如何下载的话需要进一步再看一下

分析一下需要下载图片的样式:
在这里插入图片描述

  • 头部logo,可选可不选
  • 底部二维码和文案,固定的展示
  • 中间部分是外部传进来的card部分

所以我们可以设置需要的props如下,

interface SnapshotProps {backgroundImage: number;cardNode: React.ReactNode;bottomOpacity?: number; // 底部bottom透明度isShowHeader?: boolean; // 是否需要头部logo,例如首页应该为falseviewRef: React.MutableRefObject<null>;
}

代码

import React, { memo } from 'react';
import { Image, ImageBackground, StyleSheet, Text, View } from 'react-native';
import Shopeepay from '../../assets/Shopeepay';
import QRCode from '../../assets/qrcode.png';interface SnapshotProps {backgroundImage: number;cardNode: React.ReactNode;bottomOpacity?: number; // 底部bottom透明度isShowHeader?: boolean; // 是否需要头部logo,例如首页应该为falseviewRef: React.MutableRefObject<null>;
}const getColorWithOpacity = (rgb: string, opacity: number): string =>rgb.replace(')', `, ${opacity})`).replace('rgb', 'rgba');const Snapshot = ({backgroundImage,bottomOpacity = 1,cardNode,isShowHeader = true,viewRef,
}: SnapshotProps) => {return (<ImageBackgroundstyle={styles.bgContainer}source={backgroundImage}ref={viewRef} // viewRef关键点>{isShowHeader && (<View style={styles.headerView}><View style={styles.shopeepaySvg}><Shopeepay /></View></View>)}<View style={styles.cardView}>{cardNode}</View> // 外部传进来的中间内容部分<Viewstyle={[styles.bottomView,{ // 背景透明度,如果设置Opacity属性的话,其所有子元素也会是透明或不透明状态backgroundColor: getColorWithOpacity('rgb(233,78,43)',bottomOpacity),},]}><View style={styles.leftView}><Text style={styles.title}>Scan to enter ShopeePay</Text><Text style={styles.subTitle}>Shopee.com/wrapup</Text></View><View style={styles.rightView}><Image style={styles.qrcodeImage} source={QRCode} /></View></View></ImageBackground>);
};export default memo(Snapshot);const styles = StyleSheet.create({bgContainer: {width: WINDOW_WIDTH,height: WINDOW_HEIGHT,},headerView: {justifyContent: 'center',alignItems: 'center',width: WINDOW_WIDTH,height: 100,},shopeepaySvg: {position: 'absolute',top: 50,},cardView: {flex: 1,},bottomView: {flexDirection: 'row',alignItems: 'center',justifyContent: 'space-between',paddingHorizontal: 16,height: 110,},leftView: {marginLeft: 18,},title: {fontSize: 16,fontWeight: '500',color: Colors.white,},subTitle: {fontSize: 14,marginTop: 4,color: Colors.white,},rightView: {flex: 1,marginRight: 18,alignItems: 'flex-end',},qrcodeImage: {width: 80,height: 80,},
});

使用:

const onDownloadPress = async () => {// ...const resultFile = await captureViewToImage(viewRef); // 生成一个字符串,if (resultFile) {setImgUri(resultFile);try {await storeImageToDevice(rootTag, resultFile);} catch (err) {// ...}}
};<SnapshotviewRef={viewRef} // 关键点backgroundImage={WrapUpBg}cardNode={carouselData[carouselIndex]}
/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot怎么写一个自定义的starter,Gradle依赖引入starter的Jar包

1.新建一个Spring的项目myasset-spring-boot-starter 项目结构如下: 注意:不需要Application启动类 和 application.yml/application.properties文件 2. resources下添加spring.factories文件 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfigu…

Zookeeper的基础介绍和安装教程

1、 Zookeeper入门 1.1 概述 Zookeeper是一个开源的分布式的&#xff0c;为分布式应用提供协调服务的Apache项目。 1.2 特点 1.3 数据结构 1.4 应用场景 提供的服务包括&#xff1a;统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。 统一…

ros gazebo机械臂仿真,手动控制与MoveIt自动控制

本文总结归纳古月居胡春旭ros机械臂教程&#xff0c;给出了一些error的解决方法&#xff0c;补充了通过python运行moveit。十分建议去看github huchunxu源代码的repository。 创建机械臂的xacro模型 首先创建一个工作空间&#xff0c;在工作空间中创建arm_description功能包。…

GPT如何完成AI绘图?

详情点击链接&#xff1a;GPT如何完成AI绘图&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己的GP…

react antd 计算公式 (+-*/)运算,回显

计算器的源码计算器触发事件源码 import {DictValueEnumObj } from @/components/DictTag; import {getDeptTree, getFormulaListAll, getListAll } from @/services/Energy/Metering;import {getListAllInfo, getDepartmentName } from @/services/Energy/Calculation; import…

蓝牙网关在物联网领域三大应用

蓝牙网关在物联网的应用主要包括物联网室内定位、物联网数据采集、物联网连接控制三大应用领域&#xff0c;以下对三大应用领域做详细解释。 一、物联网蓝牙室内定位 蓝牙网关在室内定位的应用包括人员定位和资产设备定位两大方向。 1、人员定位 蓝牙网关安装于室内的特定地…

护眼灯哪个品牌最好?2024年十大护眼灯品牌排行榜

由于科技水平的提高和电子产品的普及&#xff0c;儿童青少年的近视率正逐年攀升&#xff0c;出现低龄化现象&#xff0c;面对眼健康问题的严峻形势&#xff0c;我们应该还有爱眼意识、加强眼健康知识普及&#xff01;现在呢&#xff0c;护眼台灯被越来越多的人发现了&#xff0…

接口芯片选型分析 四通道差分驱动可满足ANSI TIA/EIA-422-B 和ITU V.11 的要求 低功耗,高速率,高ESD

四通道差分驱动可满足ANSI TIA/EIA-422-B 和ITU V.11 的要求 低功耗&#xff0c;高速率&#xff0c;高ESD。 其中GC26L31S可替代AM26LS31/TI&#xff0c;GC26L32S替代AM26LS32/TI&#xff0c;GC26E31S替代TI的AM26LV31E

如何快速制作网址的静态码?网址二维码在线制作的简单技巧

现在很多人会将网址转换成静态二维码来使用&#xff0c;一个原因是扫码更符合现在人们的生活习惯&#xff0c;二来是采用二维码图片来做传播能够有效的节省制作者的成本&#xff0c;而且容易更快的完成网址内容的传播&#xff0c;所以将网址生成二维码的方法现在应用非常的广泛…

U盘无法安全弹出怎么办?

当电脑弹出“弹出USB大容量存储设备时出问题”提示时&#xff0c;只能抱着侥幸的心理直接拔出&#xff0c;如果运气好&#xff0c;可能没有什么事&#xff0c;如果运气不好&#xff0c;你的U盘可能就会报废。那么&#xff0c;为什么U盘无法弹出&#xff1f;遇到U盘无法安全弹出…

ORA-600 adg无法查询故障

再续前缘 ORA-600[12406]故障解决-CSDN博客 当你点背的时候&#xff0c;看似一个简单的case&#xff0c;总是会迎来反转 上次改完参数没两天&#xff0c;又出现了报错不同&#xff0c;但是现象相似的情况 这次是 ORA-600 [kksgaGetNoAlloc_Int0] 这次出现故障的范围更大&a…

windows@管理员用户账户

文章目录 windows中的管理员用户账户将某个用户提升为管理员&#x1f388;直接创建一个管理员账户&#x1f60a;使用lusrmgr.msc程序创建先新建一个用户FAQ 在管理员组中添加新用户为管理员&#x1f388;方式1:手动输入方式2:在已有的用户列表中查找并选中修改/禁用pin码(普通情…

Vue中Vuex的环境搭建和原理分析及使用

Vuex的环境搭建 Vuex是Vue实现集中式数据管理的Vue的一个插件&#xff0c;集中式可以理解为一个老师给多个学生讲课。 Vue2.0版本的安装&#xff1a; npm i vuex3 使用Vuex需要在store中的index.js引入Vuex和main.js中引入store,目的是让vm和vc都能看到$store。实现多个组件…

降噪自编码器(Denoising Autoencoder)

降噪自编码器&#xff08;Denoising Autoencoder&#xff09;是一种用于无监督学习的神经网络模型。与普通的自编码器不同&#xff0c;降噪自编码器的目标是通过在输入数据中引入噪声&#xff0c;然后尝试从具有噪声的输入中重建原始无噪声数据。 以下是降噪自编码器的主要特点…

基于SSM的停车管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Pytest自动化测试框架

1、pytest简介 pytest是Python的一种单元测试框架&#xff0c;与python自带的unittest测试框架类似&#xff0c;但是比unittest框架使用起来更简洁&#xff0c;效率更高。 执行测试过程中可以将某些测试跳过&#xff0c;或者对某些预期失败的case标记成失败能够支持简单的单元…

关于vite的glob坑

我先展示一段代码&#xff1a; /*** function 根据pages路径动态生成路由* param {Array} 基础路由*/ export default function (routes) {const modules import.meta.glob("../pages/**/page.js", { eager: true, import: "default" });const comps im…

如何让ArcGIS Pro启动显示空白页面

刚接触ArcGIS Pro的你是否会觉得在操作上有那么一些不习惯&#xff0c;从一开始软件启动就发现和ArcGIS差距很大&#xff1a;丰富的欢迎页面&#xff0c;加上默认加载的地图让你眼花缭乱&#xff0c;这里教你如何去掉这些繁杂的内容&#xff0c;还你一个干净的启动页面。 跳过…

【算法】算法设计与分析 期末复习总结

第一章 算法概述 时间复杂度比大小&#xff0c;用代入法&#xff0c;代入2即可。求渐进表达式&#xff0c;就是求极限&#xff0c;以极限为O的括号&#xff1b;O是指上界&#xff0c;Ω是指下界&#xff0c;θ是指上下界相等&#xff0c;在这里&#xff0c;可以这样理解&#…

6.综合案例

1. 需求描述 1.1 显示所有员工信息 URI:emps 请求方式:GET 显示效果 1.2 添加操作- 去往添加页面 显示添加页面: URI:emp 请求方式:GET 显示效果 1.3 添加操作- 添加员工 添加员工信息: URI:emp 请求方式:POST 显示效果:完成添加, 重定向到 list 页面。 1.4…