news 2026/5/5 9:58:54

ReactNative for Harmony 项目鸿蒙化三方库集成实战:react-native-svg

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ReactNative for Harmony 项目鸿蒙化三方库集成实战:react-native-svg

📋 前言

react-native-svg 是一个强大的 SVG 渲染库,允许在 React Native 应用中创建和管理 SVG 图形。它支持路径、形状、渐变、文本、动画等多种 SVG 元素,完全兼容 Android、iOS 和 HarmonyOS 三端。

[!WARNING] 本项目为 react-native-svg 的 ArkTS 版本,现已停止维护。如需最新版本,请使用 react-native-svg-capi。

🎯 库简介

基本信息

  • 库名称: @react-native-oh-tpl/react-native-svg

  • 版本信息:

    • 最新版本请查看 Releases
  • 官方仓库: https://github.com/react-native-oh-library/react-native-svg

  • 主要功能:

    • 支持所有 SVG 元素(路径、形状、文本、渐变等)
    • 支持动画和交互
    • 支持自定义字体
    • 兼容 Android、iOS 和 HarmonyOS
  • 维护状态: ⚠️ 已停止维护,建议使用 react-native-svg-capi

为什么需要这个库?

  • SVG 支持: 在 React Native 中渲染 SVG 图形和动画
  • 高性能: 使用原生渲染,性能优异
  • 功能丰富: 支持几乎所有 SVG 特性
  • 跨平台: 在三端提供一致的渲染效果

📦 安装步骤

不懂得看另一篇文章 :react-native-picker适配(带图片)

1. 使用 npm 安装

在项目根目录执行以下命令:

npminstall@react-native-oh-tpl/react-native-svg@13.14.0-0.2.5

2. 验证安装

安装完成后,检查package.json文件,应该能看到新增的依赖:

{"dependencies":{"@react-native-oh-tpl/react-native-svg":"^13.14.0-0.2.5",// ... 其他依赖}}

🔧 HarmonyOS 平台配置 ⭐

由于 HarmonyOS 暂不支持 AutoLink,需要手动配置原生端代码。本文采用方法二:直接链接源码的方式。

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

首先需要使用 DevEco Studio 打开项目里的 HarmonyOS 工程harmony

打开harmony/oh-package.json5,添加以下配置:

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

2. 引入原生端代码

目前有两种方法:

方法一:通过 har 包引入

[!TIP] har 包位于三方库安装路径的harmony文件夹下。

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

"dependencies": { "@react-native-oh-tpl/react-native-svg": "file:../../node_modules/@react-native-oh-tpl/react-native-svg/harmony/svg.har" }

点击右上角的sync按钮

或者在终端执行:

cdentry ohpminstall
方法二:直接链接源码

目前 DevEco Studio 不支持通过源码引入外部 module,我们推荐使用直接链接源码的方式,将源码通过操作改成 harmony 工程的内部模块。

步骤 1: 把<RN工程>/node_modules/@react-native-oh-tpl/react-native-svg/harmony目录下的源码svg复制到harmony(鸿蒙壳工程)工程根目录下。

步骤 2: 在harmony工程根目录的build-profile.template.json5(若存在)和build-profile.json5添加以下模块:

modules: [ ... { name: '<xxx>', srcPath: './<xxx>', }, { name: 'svg', srcPath: './svg', } ]

步骤 3: 打开svg/oh-package.json5,修改react-native-openharmony和项目的版本一致。

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

"dependencies": { "@rnoh/react-native-openharmony": "0.72.90", "@react-native-oh-tpl/react-native-svg": "file:../svg" }

步骤 5: 点击 DevEco Studio 右上角的sync按钮

3. 配置 CMakeLists 和引入 SVGPackage

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

project(rnapp) cmake_minimum_required(VERSION 3.4.1) set(CMAKE_SKIP_BUILD_RPATH TRUE) set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(NODE_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../node_modules") + set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules") set(RNOH_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../react-native-harmony/harmony/cpp") set(LOG_VERBOSITY_LEVEL 1) set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments") set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie") set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use add_compile_definitions(WITH_HITRACE_SYSTRACE) 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-oh-tpl/react-native-svg/src/main/cpp" ./svg) # RNOH_END: manual_package_linking_1 file(GLOB GENERATED_CPP_FILES "./generated/*.cpp") add_library(rnoh_app SHARED ${GENERATED_CPP_FILES} "./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_svg) # RNOH_END: manual_package_linking_2

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

#include "RNOH/PackageProvider.h" #include "generated/RNOHGeneratedPackage.h" #include "SamplePackage.h" + #include "SVGPackage.h" using namespace rnoh; std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) { return { std::make_shared<RNOHGeneratedPackage>(ctx), std::make_shared<SamplePackage>(ctx), + std::make_shared<SVGPackage>(ctx), }; }

4.在 ArkTs 侧引入 SVG 组件

找到function buildCustomComponent(),一般位于entry/src/main/ets/pages/index.etsentry/src/main/ets/rn/LoadBundle.ets,添加:

... import { createRNPackages } from '../RNPackagesFactory' + import { SVG_VIEW_TYPE_NAME, SVGView } from "@react-native-oh-tpl/svg" @Builder function buildCustomComponent(ctx: ComponentBuilderContext) { if (ctx.componentName === SAMPLE_VIEW_TYPE) { SampleView({ ctx: ctx.rnComponentContext, tag: ctx.tag, buildCustomComponent: buildCustomComponent }) } + else if (ctx.componentName === SVG_VIEW_TYPE_NAME) { + SVGView({ + ctx: ctx.rnComponentContext, + tag: ctx.tag + }) + } ... } ...

本库使用了混合方案,需要添加组件名。

entry/src/main/ets/pages/index.etsentry/src/main/ets/rn/LoadBundle.ets找到常量arkTsComponentNames在其数组里添加组件名

const arkTsComponentNames: Array<string> = [ ... + SVG_VIEW_TYPE_NAME ];

5. 运行

点击右上角的sync按钮

或者在终端执行:

cdentry ohpminstall

然后编译、运行即可。

💻 代码集成

[!WARNING] 使用时 import 的库名不变。

下面是一个完整的示例,展示了 react-native-svg 的各种使用场景:

importReactfrom'react';import{View,Text,StyleSheet,ScrollView,StatusBar,SafeAreaView,}from'react-native';import{Svg,Rect,Circle,Path}from'react-native-svg';functionSvgDemo(){return(<SafeAreaView style={styles.container}><StatusBar barStyle="light-content"/><ScrollView>{/* 示例 1: 基础形状 */}<View style={styles.section}><Text style={styles.sectionTitle}>1.基础形状</Text><View style={styles.svgContainer}><Svg height="200"width="350"><Rect x="10"y="10"width="80"height="80"fill="#4c669f"stroke="black"strokeWidth="2"/><Circle cx="200"cy="50"r="30"fill="#f093fb"stroke="black"strokeWidth="2"/><Path d="M40 150 A60 30 0 1 0 160 150 A60 30 0 1 0 40 150"fill="#43e97b"stroke="black"strokeWidth="2"/><Path d="M200 100 L320 180"stroke="#ff6b6b"strokeWidth="3"fill="none"/></Svg></View></View>{/* 示例 2: 路径绘制 */}<View style={styles.section}><Text style={styles.sectionTitle}>2.路径绘制</Text><View style={styles.svgContainer}><Svg height="200"width="350">{/* 星形 */}<Path d="M100 10 L125 75 L195 75 L140 110 L160 180 L100 145 L40 180 L60 110 L5 75 L75 75 Z"fill="#f093fb"stroke="black"strokeWidth="2"/>{/* 心形 */}<Path d="M250 50 C250 20 210 20 210 50 C210 70 250 100 250 100 C250 100 290 70 290 50 C290 20 250 20 250 50 Z"fill="#ff6b6b"stroke="black"strokeWidth="2"/>{/* 波浪线 */}<Path d="M20 150 Q60 100 100 150 T180 150 T260 150"fill="none"stroke="#43e97b"strokeWidth="3"/></Svg></View></View></ScrollView></SafeAreaView>);}conststyles=StyleSheet.create({container:{flex:1,backgroundColor:'#f5f5f5',},section:{marginBottom:20,backgroundColor:'#ffffff',paddingVertical:15,},sectionTitle:{fontSize:18,fontWeight:'bold',marginBottom:10,marginLeft:15,color:'#333333',},svgContainer:{backgroundColor:'#f0f0f0',justifyContent:'center',alignItems:'center',paddingVertical:10,},});exportdefaultSvgDemo;

6. 执行npm run harmony命令

执行npm run harmony命令,构建适用于鸿蒙的 bundle 文件,并拷贝到鸿蒙工程rawfile目录下。

🎨 实际应用场景

react-native-svg 可以应用于以下实际场景:

  1. 图标渲染: 创建可缩放的矢量图标,支持多种尺寸而不失真
  2. 数据可视化: 绘制图表、图形、仪表盘等数据展示
  3. 装饰性图形: 为应用添加美观的装饰性图形元素
  4. 复杂图形: 绘制自定义的复杂图形和图案

⚠️ 注意事项与最佳实践

1. 性能优化

2. 响应式设计

// ✅ 使用百分比或相对单位<Svg width="100%"height="200"/>// ❌ 避免固定尺寸<Svg width="350"height="200"/>

3. 调试技巧

// 添加边框便于调试<Path d="..."stroke="black"strokeWidth="1"fill="none"/>

📝 总结

通过集成react-native-svg,我们为项目添加了强大的 SVG 渲染能力。该库支持所有 SVG 元素、渐变、动画等功能,可以用于图标、图表、复杂图形等各种场景。

关键要点回顾

实际效果

版本迁移提示

由于 react-native-svg(ArkTS 版本)已停止维护,建议新项目使用 react-native-svg-capi。


欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 21:24:52

Java Web 物流管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着电子商务的迅猛发展&#xff0c;物流管理系统成为企业运营中不可或缺的核心环节。传统物流管理方式因效率低下、信息孤岛问题严重&#xff0c;已无法满足现代企业对实时性、准确性和智能化的需求。物流管理系统通过信息化手段优化仓储、运输和配送流程&#xff0c;能…

作者头像 李华
网站建设 2026/5/2 12:50:04

react的hooks优缺点、底层实现及hooks参数

一、Hooks 是什么&#xff08;从设计动机说&#xff09; 一句话&#xff1a; Hooks 用函数 闭包 链表&#xff0c;模拟 Class 的生命周期和实例状态 React 团队当初想解决 3 个核心痛点&#xff1a; 1️⃣ Class 太复杂&#xff08;this、绑定、生命周期分散&#xff09; …

作者头像 李华
网站建设 2026/5/3 13:10:35

SSM疫情防疫背景下青年志愿者56iu0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面

系统程序文件列表 系统项目功能&#xff1a;志愿者,志愿者活动,活动报名,疫情数据,活动时长,普通管理员 SSM疫情防疫背景下青年志愿者管理系统开题报告 一、课题研究背景与意义 1.1 研究背景 疫情防疫工作中&#xff0c;青年志愿者作为基层防控的重要力量&#xff0c;承担着…

作者头像 李华
网站建设 2026/5/4 5:04:58

bert-base-chinese中文文本水印:基于特征向量扰动的版权标识嵌入方案

bert-base-chinese中文文本水印&#xff1a;基于特征向量扰动的版权标识嵌入方案 你有没有遇到过这样的问题&#xff1a;辛辛苦苦训练的中文文本处理模型&#xff0c;或者精心调优的业务系统&#xff0c;刚上线就被复制、迁移甚至商用&#xff1f;更麻烦的是&#xff0c;一旦内…

作者头像 李华
网站建设 2026/5/4 5:04:24

SiameseUIE中文信息抽取:法律文书关键实体识别案例分享

SiameseUIE中文信息抽取&#xff1a;法律文书关键实体识别案例分享 在处理大量法律文书时&#xff0c;你是否也遇到过这样的困扰&#xff1a;判决书、起诉状、合同文本动辄数千字&#xff0c;关键信息却像藏宝图一样散落在字里行间&#xff1f;人工逐字筛查不仅耗时费力&#…

作者头像 李华