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

需求

点击右上角下载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]}
/>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024最新外贸建站:ChemiCloud主机购买使用及自建外贸独立站教程

随着电商平台竞争的加剧&#xff0c;许多外贸从业者意识到减少对平台依赖的重要性&#xff0c;并选择搭建自己的外贸独立站来获得更多的控制权和灵活性。即使是没有建站基础的新手&#xff0c;也可以通过学习建站来实现这一目标。下面是一个适用于新手的外贸建站教程&#xff0…

【Java】设计模式之保护性暂停

设计模式之保护性暂停 Guarded Suspension&#xff0c;这个设计模式&#xff0c;主要用在一个线程等待另一个线程的执行结果&#xff08;发请求等待响应&#xff09; 有一个结果需要从一个线程传递到另一个线程&#xff0c;传递只进行一次&#xff0c;用设计模式保护性暂停。 …

46 WAF绕过-信息收集之反爬虫延时代理池技术

目录 简要本章具体内容和安排缘由简要本课具体内容和讲课思路简要本课简要知识点和具体说明演示案例:Safedog-默认拦截机制分析绕过-未开CCSafedog-默认拦截机制分析绕过-开启CC总结&#xff1a; Aliyun_os-默认拦截机制分析绕过-简要界面BT(防火墙插件)-默认拦截机制分析绕过-…

小米汽车的占用网络是什么

大家好啊&#xff0c;我是董董灿。 昨天小米汽车开了发布会&#xff0c;一下子喜提十几个热搜。 就在人们纷纷猜测&#xff0c;小米汽车的定价会不会延续小米极致性价比风格时。 雷总的一句"电池成本都不下于十几万"&#xff0c;瞬间把人们对于小米汽车定价的幻想拉…

CMake入门教程【核心篇】静态库 (.a, .lib)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 概述创建静态库添加静态库到你的项目完整代码示例实战使用技巧与注意事项总结与分析概述 静态库在C++开发中扮演着重要的角色。它们通常以.a(在Unix-like系统

新手练习项目 4:简易2048游戏的实现(C++)

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#xff09; 目录 一、效果图二、代码&#xff08;带注释&#xff09;三、说明 一、效果图 二、代码&#xff08;带…

MYSQL篇--索引高频面试题

mysql索引 1什么是索引&#xff1f; 索引说白了就是一种数据结构&#xff0c;可以协助快速查询数据&#xff0c;以及更新数据库表中的数据&#xff0c;更通俗的来说索引其实就是目录&#xff0c;通过对数据建立索引形成目录&#xff0c;便于去查询数据&#xff0c;而mysql索引…

静态网页设计——旅游景点介绍(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1f64y1N7uH/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

虚拟机VMware安装Linux

关于安装&#xff0c;安装版本是CentOS 7&#xff0c;选择最小安装即可 第一步&#xff1a;选择创建新的虚拟机 第二步&#xff1a;默认典型&#xff0c;点击下一步 第三步&#xff1a;选择稍后安装操作系统 第四步&#xff1a;选择Linux和版本 第五步&#xff1a;输入虚拟机名…

初识Kafka

1.初识kafka 官网&#xff1a;Apache Kafka Apache Kafka是一个分布式流处理平台&#xff0c;最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统&#xff0c;可以快速地处理高吞吐量的…

杨中科 ASP.NET Core前后端分离开发

一、 前后端分离 1、传统MVC开发模式: 前后端的代码被放到同一个项目中&#xff0c;前端人员负责编写页面的模板&#xff0c;而后端开发人员负责编写控制器和模型的代码并且“套模板”。 缺点: 互相依赖&#xff0c;耦合性强&#xff0c;责任划分不清。 2、主流的“前后端分离…

西门子WinCC的C脚本——对象的事件任务

1、 全局脚本编辑器&#xff1b; 2、 对象的属性任务&#xff1b; 3、 对象的事件任务。 本文探讨一下用C脚本来实现对象的事件任务。 一、例程说明引文&#xff1a;博途工控人平时在哪里技术交流博途工控人社群 如图1所示&#xff0c;为本例程的运行画面。本例程实现以下…

【MATLAB第89期】基于MATLAB的差分自回归滑动平均模型ARIMA时间序列预测模型含预测未来

【MATLAB第89期】基于MATLAB的差分自回归滑动平均模型ARIMA时间序列预测模型含预测未来 往期文章 【MATLAB第82期】基于MATLAB的季节性差分自回归滑动平均模型SARIMA时间序列预测模型含预测未来 一、模型介绍 1、模型简介 差分自回归移动平均模型&#xff08;Autoregressiv…

外包做了1个月,技术退步一大半了。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

【mysql】—— 事务

目录 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;事务的理解 1、为什么会出现事务 2、什么是事务&#xff1f; 3、事务的版本支持 4、事务提交方式 &#xff08;三&#xff09;事务常见操作方式 1、正常演示 - 证明事务的开始与回滚 2、非正常演示…

CSAPP cache lab - Optimizing Matrix Transpose

CSAPP cache lab part B 矩阵转置 矩阵转置是一种操作&#xff0c;它将矩阵的行和列互换位置&#xff0c;即将原始矩阵的行变为转置矩阵的列&#xff0c;将原始矩阵的列变为转置矩阵的行。转置操作可以通过改变矩阵的布局来方便地进行某些计算和分析。 假设有一个mn的矩阵A&…

Qt读取文件对比:每次获取自定义的长度和使用系统的API,耗时对比

0. 前言 在编程过程中&#xff0c;经常遇到文件读写操作&#xff0c;太频繁了。每次也都写的不一样。 突发奇想&#xff0c;想测试下几种不同的读取文件的效率。 测试以下三种方式读取文件效率&#xff1a; 自定义读取文件耗时使用QFile类API读取文件耗时使用QTextStream类AP…

【BIAI】Lecture 5 - Auditory system

Lecture 5 - Auditory system 专业术语 auditory system 听觉系统 pinna 耳廓 auditory canal 耳道 tympanic membrane 鼓膜 cochlea 耳蜗 ossicles 听骨 auditory-vestibular nerve 前庭神经 oval window 椭圆窗 attenuation reflex 衰减反射 tensor tympani muscle 鼓膜张肌…

那些年听烂了的名词之“高可用“

那些年听烂了的名词之"高可用" 引言什么是可用性 ?哪些风险会影响系统的可用性 &#xff1f;如何应对这些风险&#xff0c;从而确保系统的可用性 &#xff1f;Phase: 设计做好容灾和多活处理做好容错设计做好资源隔离做好扩展性设计做好数据一致性处理 Phase: 预防做…

适配器Adapters

1.适配器作用 主要是对底层的东西进行改造 2.适配器种类&#xff1a;容器适配器&#xff0c;迭代器适配器&#xff0c;仿函数适配器 2.1容器适配器&#xff1a; stack&#xff0c;queue他们两的底层结构都为deque&#xff0c;deque有好多功能&#xff0c;而stack&#x…