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

2024-01-09

需求

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

在这里插入图片描述

流程

下载图片的本质其实是,

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

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

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

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

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

interface SnapshotProps {
  backgroundImage: number;
  cardNode: React.ReactNode;
  bottomOpacity?: number; // 底部bottom透明度
  isShowHeader?: boolean; // 是否需要头部logo,例如首页应该为false
  viewRef: 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,例如首页应该为false
  viewRef: 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 (
    <ImageBackground
      style={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> // 外部传进来的中间内容部分
      <View
        style={[
          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) {
      // ...
    }
  }
};

<Snapshot
  viewRef={viewRef} // 关键点
  backgroundImage={WrapUpBg}
  cardNode={carouselData[carouselIndex]}
/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react-native下载图片到本地相册 的相关文章

  • 如何在故事书中注入窗口变量?

    我想添加一个 React 组件 称为ApplicationForm to a 故事书 https github com storybooks storybook 故事书是这样写的 import configureStore from sto
  • 如何针对 Node.js 中发生的每个错误发送电子邮件?

    假设我的 node js 应用程序正在运行 如果出现错误 我的意思是所有错误 不仅仅是网络错误 如果出现错误 则很重要 我如何调用函数向我发送电子邮件 基本上 在我希望它写入 err out 之前 我希望向我发送一封电子邮件 我正在使用no
  • 使用 dc.js 按条形值对条形图中的条形进行排序(排序)

    如何通过维度的计算值而不是维度本身的名称对 dc js 示例中的 x 轴 维度 进行排序 例如 请考虑序数条形图的 dc js 示例 https github com dc js dc js blob master web examples
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 如何让 Django 和 ReactJS 协同工作?

    New to Django and even newer to ReactJS I have been looking into AngularJS and ReactJS but decided on ReactJS It seemed
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • Javascript - 水波纹效果

    我需要 JS 上的脚本 它将以 水波纹 样式更改 images html 抱歉 6MB GIF 文件 http fcuunited ru temp listening2 gif http fcunited ru temp listening
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz
  • Cypress 在 Create React App 中返回 .scss 文件的 webpack 编译错误

    我正在尝试将 Cypress 添加到非常基本的 CRA 但遇到了 Cypress 无法理解 scss 文件的问题 当我跑步时npm run cypress运行测试 我收到以下错误 Error Webpack Compilation Erro
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro

随机推荐

  • Python库中关于时间的常见操作

    目录 导入所需的库 获取当前时间 格式化日期和时间 解析日期和时间字符串 时间戳操作 获取当前时间戳 将时间戳转换为日期和时间 时间差操作 时间日期的时区处理 时间日期的随机生成 注意事项 总结 在Python中 时间处理是一个重要的主题
  • 从three.js旋转动画,我了解了requestAnimationFrame

    前言 大家好 我是南木元元 热衷分享有趣实用的文章 希望大家多多支持 一起进步 个人主页 南木元元
  • 48V转12V的DC-DC稳压电路推荐

    项目或学习过程中好用且稳定的DC DC的电路将是一个成功硬件项目的基础 主芯片 MP9486 MP9486A 是一款高压降压型开关稳压器 可输 出高达 1A 的持续电流至负载 它集成了一个高 压高端 MOSFET 提供 3 5A 的典型峰值
  • 2024了,我不允许你还不会:Qt查看与调试源码

    一 人人都是大佬 谦 卑 虚 心 长远进步 作为一个Qt的开发者 下面这段代码你已经快到了 相看两不厌 的状态了吧 你有没有好奇过 a exec 到底干了什么 我不允许你再说 这是 Qt 内部干的事情 没办法去看啊 那么 真的没办法去看么
  • 软考考试多少分通过?

    根据 人力资源社会保障部办公厅关于单独划定部分专业技术人员职业资格考试合格标准有关事项的通知 人社厅发 2022 25号 的相关规定 软考考试在一般情况下是需要达到45分才能及格的 但在一些特定地区却有不同的要求 这些地区包括国家乡村振兴重
  • 个性化语音生成:五种基于Python的方法

    引言 随着人工智能技术的不断发展 语音生成已经成为一个热门的研究领域 个性化语音生成技术可以根据用户的需求和特点 生成具有高度相似度的语音 广泛应用于语音助手 虚拟人物 语音合成等领域 本文将介绍五种基于Python的个性化语音生成方法 包
  • vue3 父传参到子(defineProps),父调子方法(defineExpose)

    父页面
  • Element-Puls中el-upload组件结合vue-draggable-plus实现上传支持拖拽排序(并保留el-upload原有样式、预览、删除)等功能

    展示效果 需求 需求想要一个可拖拽排序的图片列表 但是发现el upload虽然可以实现照片墙 但是没办法拖拽 实现思路 使用 vue draggable plus 拖拽插件 隐藏Upload原有的已上传文件列表 自定义上传后文件列表的样式
  • 软件开发和网络安全哪个更好找工作?

    为什么今年应届毕业生找工作这么难 有时间去看看张雪峰今年为什么这么火就明白了 这么多年人才供给和需求错配的问题 在经济下行的今年 集中爆发 供给端 大学生越来越多 需求端 低端工作大家不愿去 高端岗位又太少 很多基础行业 比如机械 土木 所
  • 拼多多详情API开启运营比价新纪元

    随着互联网的快速发展 电商行业正在迅速崛起 拼多多作为一家新兴的电商平台 凭借其独特的营销策略和创新的商业模式 成为了电商行业的一匹黑马 在拼多多的成功背后 其详情API接口营销起到了至关重要的作用 本文将详细介绍拼多多详情API接口营销的
  • 如何读取文件的最后一行并解析

    首先需要了解 ifstream 的 seekg函数 它主要是 用于设置在输入流中的位置 file seekg 0 ios end ios beg 从文件头开始计算偏移量 ios end 从文件末尾开始计算偏移量 ios cur 从当前位置开
  • 线上企业展厅:企业发展新利器,轻松实现线上企业展示

    引言 在当今数字化时代 线上企业展厅已经成为企业展示品牌形象 推广产品的重要手段 它不仅可以帮助企业拓宽市场 提升品牌知名度 还能为企业带来更多的商业机会 那么线上企业展厅有什么优势 如何搭建成功的线上企业展厅 一 线上企业展厅的优势 1
  • 【镜像压缩】linux 上 SD/TF 卡镜像文件压缩到实际大小的简单方法(树莓派、nvidia jetson)

    文章目录 1 备份 SD TF 卡为镜像文件 2 压缩镜像文件 2 1 多分区镜像文件的压缩 树莓派 普通 linux 系统等 2 2 单分区镜像文件的压缩 Nvidia Jetson Nano 等 3 还原镜像文件到 SD TF 卡
  • MIT_线性代数笔记:复习二

    目录 第二单元主要内容 例题 第二单元主要内容 正交矩阵 Q 用矩阵形式描述正交性质 投影矩阵 P 最小二乘法 在方程无解时求 最优解 Gram Schmidt 正交化 从任意一组基得到标准正交基 策略是从向量 中减去投影到其它向量方向的分
  • Linux 软件安装以及管理

    本篇主要记录常用的软件安装和管理方式 主要是 yum rpm dnf apt pip 大致都是一样的 主要是部分软件提供了解决依赖的功能 内容不包括源码安装 源码安装情况相对比较复杂 后续有时间再补充 约定 案例所用模板软件均为 pytho
  • JS特效第74弹:旅游城市图片百叶窗切换React特效

    全屏的旅游城市景点图片滑动百叶窗轮播切换效果 先来看看效果 一部分关键的代码如下 div div
  • 魏副业而战:小红书AI漫画副业项目

    我是魏哥 与其躺平 不如魏副业而战 今天魏哥给大家分享一个小红书AI漫画副业项目 大家都知道小红书上用户80 以上都是女性 而我们今天的项目主要利用AI生成的漫画宝宝图片来吸引宝妈用户 这个项目操作简单 适合宝妈 或有空闲时间的小伙伴 我们
  • /lib64/libstdc++.so.6库缺失

    问题 lib64 libstdc so 6 version CXXABI 1 3 8 not found lib64 libstdc so 6 version CXXABI 1 3 9 not found lib64 libstdc so
  • 数字后端设计实现之自动化useful skew技术(Concurrent Clock &Data)

    在数字IC后端设计实现过程中 我们一直强调做时钟树综合要把clock skew做到最小 原因是clock skew的存在对整体设计的timing是不利的 但是具体到某些timing path 可能它的local clock skew对tim
  • react-native下载图片到本地相册

    需求 点击右上角下载icon 可以将当前图片下载并保存到本地相册 下载的图片 流程 下载图片的本质其实是 固定需要下载的页面内容和样式 将其放在当前页面不可见区域 点击下载按钮 穿一个ref给native 会自动拉起手机系统下载到本地相册