rntpc_react-native-view-shot:基于 react-native-view-shot 的 OpenHarmony 适配版,将任意视图捕获为图片(截图)

基于 react-native-view-shot 的 OpenHarmony 适配版,将任意视图捕获为图片(截图)

分支3Tags5
文件最后提交记录最后更新时间
7 天前
10 天前
6 天前
1 个月前
6 年前
6 天前
6 天前
3 年前
13 天前
6 天前
9 年前
1 个月前
1 个月前
6 天前
6 天前
1 个月前
6 天前
9 年前
6 天前

文档模板:v0.4.2

react-native-view-shot

本项目基于 react-native-view-shot 开发。

该第三方库的仓库已迁移至 Gitcode,并支持直接从 npm 下载,新包名为:@react-native-ohos/react-native-view-shot。各版本归属关系如下:

第三方库名称 第三方库版本(npm 地址) 发布信息 支持 RN 版本 Autolink 编译 API 版本 社区基线版本 源码地址
@react-native-ohos/react-native-view-shot ~4.0.0 Gitcode 发行版 0.84.* / 0.82.* API12+ 5.1.1 master
@react-native-ohos/react-native-view-shot ~3.9.0 Gitcode 发行版 0.77.* API12+ 3.8.0 br_rnoh0.77
@react-native-ohos/react-native-view-shot ~3.8.1 Gitcode 发行版 0.72.* API12+ 3.8.0 br_rnoh0.72
@react-native-oh-tpl/react-native-view-shot <=3.8.0-0.3.2@deprecated Github 发行版(已弃用) 0.72.* API12+ 3.8.0 sig

简介

一个用于将 React Native 视图捕获为图片的库。

下载安装

进入工程目录并输入以下命令:

npm

npm install @react-native-ohos/react-native-view-shot

yarn

yarn add @react-native-ohos/react-native-view-shot

链接

是否支持 autolink RN 框架版本
~4.0.0 0.84

使用 AutoLink 的工程需根据该文档进行配置。Autolink 框架指导文档:https://gitcode.com/CPF-RN/ohos_react_native/blob/master/docs/zh-cn/Autolinking.md

若您使用的版本支持 Autolink,并且工程已接入 Autolink,可跳过 ManualLink 配置。

ManualLink:本步骤为手动配置原生依赖项的指导

请先使用 DevEco Studio 打开项目中的 HarmonyOS 工程 harmony。

1. 在工程根目录的 oh-package.json5 中添加 overrides 字段

{
  ...
  "overrides": {
    "@rnoh/react-native-openharmony" : "./react_native_openharmony"
  }
}

引入原生端代码

目前有两种方式:

  1. 通过 har 包引入(待 IDE 完善相关功能后,该方式将被弃用,当前建议优先使用);
  2. 直接引用源码。

方式一:通过 har 包引入(推荐)

har 包位于第三方库安装路径下的 `harmony` 文件夹中。

打开 entry/oh-package.json5,添加以下依赖:

"dependencies": {
    "@rnoh/react-native-openharmony": "file:../react_native_openharmony",

    "@react-native-ohos/react-native-view-shot": "file:../../node_modules/@react-native-ohos/react-native-view-shot/harmony/view_shot.har"
  }

点击右上角的 sync 按钮

或者在终端中执行:

cd entry
ohpm install

方法二:直接链接源码

如需使用直接链接源码,请参考[直接链接源码说明](https://gitcode.com/CPF-RN/usage-docs/blob/master/zh-cn/link-source-code.md)

配置 CMakeLists 和引入 ViewShotPackage

打开 entry/src/main/cpp/CMakeLists.txt,添加:

project(rnapp)
cmake_minimum_required(VERSION 3.4.1)
set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+ set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
set(RNOH_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../react-native-harmony/harmony/cpp")

add_subdirectory("${RNOH_CPP_DIR}" ./rn)

# RNOH_BEGIN: manual_package_linking_1
add_subdirectory("../../../../sample_package/src/main/cpp" ./sample-package)
+ add_subdirectory("${OH_MODULES}/@react-native-ohos/react-native-view-shot/src/main/cpp" ./view-shot)
# RNOH_BEGIN: manual_package_linking_1

add_library(rnoh_app SHARED
    "./PackageProvider.cpp"
    "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
)

target_link_libraries(rnoh_app PUBLIC rnoh)

# RNOH_BEGIN: manual_package_linking_2
target_link_libraries(rnoh_app PUBLIC rnoh_sample_package)
+ target_link_libraries(rnoh_app PUBLIC rnoh_view_shot)
# RNOH_BEGIN: manual_package_linking_2

打开 entry/src/main/cpp/PackageProvider.cpp,添加:

#include "RNOH/PackageProvider.h"
#include "SamplePackage.h"
+ #include "ViewShotPackage.h"

using namespace rnoh;

std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {
    return {
      std::make_shared<SamplePackage>(ctx),
+     std::make_shared<ViewShotPackage>(ctx)
    };
}

在 ArkTs 侧引入 ViewShotPackage

打开 entry/src/main/ets/RNPackagesFactory.ts,添加:

  ...
+ import { ViewShotPackage } from '@react-native-ohos/react-native-view-shot/ts';

export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
  return [
    new SamplePackage(ctx),
+   new ViewShotPackage(ctx),
  ];
}

运行

点击右上角的 sync 按钮

或在终端执行:

cd entry
ohpm install

然后,直接编译并运行即可。

约束与限制

兼容性

本文档中的内容已在以下环境中验证通过:

  1. RNOH: 0.84.1; SDK: HarmonyOS 6.0.0 Release SDK; IDE: DevEco Studio 6.0.0.858; ROM: 6.0.0.112;

使用示例

以下代码展示了该库的基本使用场景:

使用时,import 的库名保持不变。

import React from "react";
import { View, Text, Button } from "react-native";
import ViewShot, { captureRef, captureScreen } from "react-native-view-shot";

export function ViewShotDemo() {
  const view = React.useRef < View > (null);
  const ref = React.useRef(null);
  const onCapture = (res) => {
    console.info("onCapture callback");
  };
  const onCaptureFailure = (err) => {
    console.info("onCaptureFailure " + JSON.stringify(err));
  };

  return (
    <View>
      <View
        ref={view}
        collapsable={false}
        style={{ backgroundColor: "#ffffff" }}
      >
        <Text style={{ color: "#000", marginBottom: 30 }}>
          Hello OpenHarmony
        </Text>
        <Text style={{ color: "#000", marginBottom: 30 }}>Hello HarmonyOS</Text>
        <Text style={{ color: "#000", marginBottom: 30 }}>
          Hello HarmonyOS Next.
        </Text>

        <ViewShot
          ref={ref}
          style={{ backgroundColor: "#ffffff" }}
          onCapture={onCapture}
          onCaptureFailure={onCaptureFailure}
          captureMode="mount"
        >
          <Text style={{ color: "#000", marginBottom: 30 }}>Hello World</Text>
        </ViewShot>

      </View>
      <Button
        title="captureRef"
        onPress={() => {
          captureRef(view).then((res) => {
            console.info(`captureRef: ${JSON.stringify(res)}`);
          });
        }}
      />
      <Button
        title="ViewShot capture"
        onPress={() => {
          captureRef(ref).then((res) => {
            console.info(`captureRef: ${res}`);
          });
        }}
      />
      <Button
        title="captureScreen"
        onPress={() => {
          captureScreen().then((res) => {
            console.info(`captureScreen success: ${res}`);
          });
        }}
      />
    </View>
  );
}

属性

“平台”列表示该属性在原第三方库上支持的平台。

“HarmonyOS 支持”列用于说明 HarmonyOS 平台的支持状态:“支持”表示支持该属性;“不支持”表示不支持该属性;“部分支持”表示部分支持该属性。各平台的使用方法一致,实际效果对标 iOS 或 Android。

属性名 说明 类型 是否必填 平台 HarmonyOS 支持
captureMode 未设置时(默认),不会自动截图,需要通过 ref 手动调用 capture()
"mount":组件挂载后自动截图一次。(注意:不会等待图片加载完成;如需等待图片加载完成,建议设置为 "none",并在 Image#onLoad 后调用 viewShotRef.capture()。)
"continuous":实验特性,会持续进行截图,仅适用于非常特殊的场景。
"update":实验特性,每次 React 重绘(on did update)时都会截图,仅适用于非常特殊的场景。
( 'mount' | 'continuous' | 'update') Android, iOS 支持
onCapture 设置 captureMode 后,截图成功时会调用该回调,并传入截图结果。 function Android, iOS 支持
onCaptureFailure 设置 captureMode 后,截图失败时会调用该回调。 function Android, iOS 支持
options 截图配置项。 object Android, iOS 部分支持
children 实际需要被栅格化(截图)的内容。 ReactNode Android, iOS 支持

options属性详情

属性名 说明 类型 必填 平台 HarmonyOS 支持
fileName 文件名,长度至少为 3 个字符。 string Android, iOS
width / height 最终图片的宽度与高度(会根据 View 边界进行缩放。若需保留原始像素尺寸,请勿传入此参数)。 number Android, iOS
quality 图片质量,取值范围为 0.0 - 1.0(默认值),仅适用于有损压缩格式(如 jpg)。 number Android, iOS
format 图片格式,可选值:png、jpg、webp、webm,默认值为 png。 string Android, iOS
result 保存截图的方式,可选值如下:
"tmpfile"(默认):保存到临时文件(仅在应用运行期间有效)。
"base64":以 base64 编码后返回原始字符串。建议仅用于小尺寸图片,因为较大字符串可能引发卡顿(字符串需通过桥接传输)。注意:该值不是 data uri,如需 data uri 请使用 data-uri。
"data-uri":与 base64 相同,但会携带 Data URI scheme 请求头。
"zip-base64":先使用 Zip/Deflate 算法压缩数据,再转换为 Base64 并返回原始字符串
( 'tmpfile' |'base64' |'data-uri' |'zip-base64' ) Android, iOS 部分支持(不支持 zip-base64)
snapshotContentContainer 若为 true 且 view 为 ScrollView,则使用内容容器(content container)的高度,而非容器本身的高度。 boolean Android, iOS
handleGLSurfaceViewOnAndroid 当 handleGLSurfaceViewOnAndroid 设置为 true,且视图为 SurfaceView(或视图树中包含 SurfaceView)时,将捕获该视图的内容。 boolean Android
useRenderInContext 调整 iOS 截图策略,使用 renderInContext 方法替代 drawViewHierarchyInRect,适用于某些特定场景。 boolean Android, iOS

接口

“平台”列表示该属性在原三方库中支持的平台。

“HarmonyOS 支持”列为“是”表示 HarmonyOS 平台支持该属性;“否”表示不支持;“部分支持”表示部分支持。跨平台使用方法一致,效果与 iOS 或 Android 保持一致。

名称 描述 类型 是否必填 平台 HarmonyOS 支持
captureRef 组件截图 函数 Android、iOS
captureScreen 屏幕截图 函数 Android、iOS
releaseCapture 释放资源 函数 Android、iOS

遗留问题

其他

目录结构

/rntpc_react-native-view-shot  # 项目根目录
│  LICENSE
│  OAT.xml
│  package.json
│  README.md
│  README.OpenSource
│  README_en.md
│
├─example
│
├─harmony
│  │  view_shot.har     # 编译后的 HAR 包(HarmonyOS Archive)
│  │
│  └─view_shot          # 鸿蒙适配核心代码
│      │  .gitignore
│      │  build-profile.json5
│      │  hvigorfile.ts
│      │  Index.ets
│      │  oh-package.json5
│      │  ts.ets
│      │
│      └─src
│          └─main
│            │  module.json5
│            │
│            ├─cpp                       # C++ 原生层(新架构 Fabric/TurboModule)
│            │      CMakeLists.txt
│            │      ViewShotPackage.h
│            │      ViewShotTurboModule.cpp
│            │      ViewShotTurboModule.h
│            │
│            ├─ets                      # ArkTS 业务层
│            │      Logger.ts
│            │      ViewShotPackage.ets
│            │      ViewShotTurboModule.ets
│            │
│            └─resources                # 资源文件
│
└─src                                  
    │  index.tsx
    │  RNViewShot.ts
    │  RNViewShot.web.ts
    │
    └─specs
            NativeRNViewShot.ts

贡献代码

在使用过程中发现任何问题,都可以提交 Issue,当然,也非常欢迎提交 PR

开源协议

本项目基于 The MIT License (MIT),请自由使用并参与开源。

项目介绍

基于 react-native-view-shot 的 OpenHarmony 适配版,将任意视图捕获为图片(截图)

定制我的领域