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 安装在项目根目录执行以下命令npminstallreact-native-oh-tpl/react-native-svg13.14.0-0.2.52. 验证安装安装完成后检查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-errorunused-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::vectorstd::shared_ptrPackage PackageProvider::getPackages(Package::Context ctx) { return { std::make_sharedRNOHGeneratedPackage(ctx), std::make_sharedSamplePackage(ctx), std::make_sharedSVGPackage(ctx), }; }4.在 ArkTs 侧引入 SVG 组件找到function buildCustomComponent()一般位于entry/src/main/ets/pages/index.ets或entry/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.ets或entry/src/main/ets/rn/LoadBundle.ets找到常量arkTsComponentNames在其数组里添加组件名const arkTsComponentNames: Arraystring [ ... SVG_VIEW_TYPE_NAME ];5. 运行点击右上角的sync按钮或者在终端执行cdentry ohpminstall然后编译、运行即可。 代码集成[!WARNING] 使用时 import 的库名不变。下面是一个完整的示例展示了 react-native-svg 的各种使用场景importReactfromreact;import{View,Text,StyleSheet,ScrollView,StatusBar,SafeAreaView,}fromreact-native;import{Svg,Rect,Circle,Path}fromreact-native-svg;functionSvgDemo(){return(SafeAreaView style{styles.container}StatusBar barStylelight-content/ScrollView{/* 示例 1: 基础形状 */}View style{styles.section}Text style{styles.sectionTitle}1.基础形状/TextView style{styles.svgContainer}Svg height200width350Rect x10y10width80height80fill#4c669fstrokeblackstrokeWidth2/Circle cx200cy50r30fill#f093fbstrokeblackstrokeWidth2/Path dM40 150 A60 30 0 1 0 160 150 A60 30 0 1 0 40 150fill#43e97bstrokeblackstrokeWidth2/Path dM200 100 L320 180stroke#ff6b6bstrokeWidth3fillnone//Svg/View/View{/* 示例 2: 路径绘制 */}View style{styles.section}Text style{styles.sectionTitle}2.路径绘制/TextView style{styles.svgContainer}Svg height200width350{/* 星形 */}Path dM100 10 L125 75 L195 75 L140 110 L160 180 L100 145 L40 180 L60 110 L5 75 L75 75 Zfill#f093fbstrokeblackstrokeWidth2/{/* 心形 */}Path dM250 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 Zfill#ff6b6bstrokeblackstrokeWidth2/{/* 波浪线 */}Path dM20 150 Q60 100 100 150 T180 150 T260 150fillnonestroke#43e97bstrokeWidth3//Svg/View/View/ScrollView/SafeAreaView);}conststylesStyleSheet.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. 性能优化避免使用过于复杂的路径对于静态图形考虑使用图片代替在 ScrollView 中避免大量复杂的 SVG2. 响应式设计// ✅ 使用百分比或相对单位Svg width100%height200/// ❌ 避免固定尺寸Svg width350height200/3. 调试技巧// 添加边框便于调试Path d...strokeblackstrokeWidth1fillnone/ 总结通过集成react-native-svg我们为项目添加了强大的 SVG 渲染能力。该库支持所有 SVG 元素、渐变、动画等功能可以用于图标、图表、复杂图形等各种场景。关键要点回顾✅安装依赖:npm install react-native-oh-tpl/react-native-svg✅配置平台: 通过 har 包或直接链接源码配置 CMakeLists.txt、PackageProvider.cpp 和 RNPackagesFactory.ts✅集成代码: 使用react-native-svg导入组件✅支持功能: 所有 SVG 元素、路径、形状等✅测试验证: 确保三端表现一致⚠️重要: 本库已停止维护建议使用 react-native-svg-capi实际效果Android: 原生渲染的 SVG 图形iOS: 高质量的渲染效果HarmonyOS: 一致的渲染表现版本迁移提示由于 react-native-svgArkTS 版本已停止维护建议新项目使用 react-native-svg-capi。欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net

相关新闻

Vercel 团队 10 年 React 性能优化经验:10 大核心策略让性能提升 300%

Vercel 团队 10 年 React 性能优化经验:10 大核心策略让性能提升 300%

Vercel 最近发布了 React 最佳实践库,将十余年来积累的 React 和 Next.js 优化经验整合到了一个指南中。 其中一共包含8 个类别、40 多条规则。 这些原则并不是纸上谈兵,而是 Vercel 团队在 10 余年从无数生产代码库中总结出的经验之谈。它们已经被无数…

2026/7/8 6:33:48 阅读更多 →
跨境电商多账号运营的“人效打法”:小团队也能跑出矩阵的12个关键动作

跨境电商多账号运营的“人效打法”:小团队也能跑出矩阵的12个关键动作

多账号运营最现实的矛盾是:账号可以很多,人永远不够用。 如果你每增加一个账号,就必须增加一个运营、一个投手、一个客服,那矩阵永远做不大;但如果你靠“大家多加班”硬撑,迟早崩盘。这篇文章不讲宏观理论&…

2026/7/6 14:26:02 阅读更多 →
基于SpringBoot+Vue的开发精简博客系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

基于SpringBoot+Vue的开发精简博客系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着互联网技术的快速发展,个人博客系统成为用户分享知识、记录生活的重要平台。传统博客系统功能复杂、开发成本高,难以满足用户对轻量级、易用性的需求。基于此,设计并实现一款精简高效的博客管理系统具有重要的现实意义。该系统采用前…

2026/7/7 6:08:44 阅读更多 →

最新新闻

PHP shell_exec() 函数安全审计:从 Pikachu RCE 漏洞看 4 类高危参数过滤

PHP shell_exec() 函数安全审计:从 Pikachu RCE 漏洞看 4 类高危参数过滤

PHP shell_exec() 函数安全审计:从 Pikachu RCE 漏洞看 4 类高危参数过滤在Web应用开发中,系统命令执行功能是常见的需求场景,比如网络设备管理界面中的ping测试、自动化运维平台中的批量操作等。然而,当开发者直接使用shell_exec…

2026/7/9 20:04:30 阅读更多 →
AD5593R与PIC32MX764F128L的混合信号系统设计

AD5593R与PIC32MX764F128L的混合信号系统设计

1. AD5593R与PIC32MX764F128L的硬件协同设计1.1 AD5593R的核心特性解析AD5593R这颗芯片最吸引人的地方在于它的多功能引脚配置能力。每个引脚都可以独立配置为12位DAC输出、12位ADC输入、数字输出或数字输入。在实际项目中,这种灵活性意味着我们可以用单颗芯片实现复…

2026/7/9 20:02:30 阅读更多 →
Windows部署Claude Code全攻略:绕过PowerShell、Git、npm权限四大坑

Windows部署Claude Code全攻略:绕过PowerShell、Git、npm权限四大坑

1. 项目概述:这不是“装个软件”,而是给Windows补上缺失的AI原生开发能力“零基础在Windows系统上安装部署Claude Code”——这个标题乍看像一句普通教程,但背后藏着一个被长期忽视的事实:Windows作为全球装机量最大的桌面操作系统…

2026/7/9 20:02:30 阅读更多 →
代码审查 Agent Harness 实战:AI 自动 Code Review

代码审查 Agent Harness 实战:AI 自动 Code Review

一、引言:Code Review 的日常之痛 如果你在团队里做过 Reviewer,大概率经历过这些场景:上午打开 GitHub,10 个 PR 等着你,每个 PR 上千行变更,业务逻辑弯弯绕绕,你一个一个文件翻,看…

2026/7/9 20:02:30 阅读更多 →
GXDE OS深度体验:基于DDE DE 15的轻量Linux发行版如何平衡经典与实用

GXDE OS深度体验:基于DDE DE 15的轻量Linux发行版如何平衡经典与实用

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 上周在折腾一台老笔记本,想找个轻量、好看、开箱即用的 Linux 发行版,结果在社区里看到有人提 GXDE OS。第一眼…

2026/7/9 19:58:29 阅读更多 →
华硕笔记本性能瓶颈如何破?开源轻量级控制工具G-Helper全解析

华硕笔记本性能瓶颈如何破?开源轻量级控制工具G-Helper全解析

华硕笔记本性能瓶颈如何破?开源轻量级控制工具G-Helper全解析 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenb…

2026/7/9 19:54:28 阅读更多 →

日新闻

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 还在为Foobar2000找不到高质…

2026/7/9 0:01:04 阅读更多 →
ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook 你是否曾经为学术书籍的封面设计而烦恼?想要一个既专业又美观的封…

2026/7/9 0:03:06 阅读更多 →
如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南 【免费下载链接】pyodbc Python ODBC bridge 项目地址: https://gitcode.com/gh_mirrors/py/pyodbc 在当今数据驱动的商业环境中,企业级数据库连接已成为现代应用开发的核心需求。pyodbc作为一款强大…

2026/7/9 0:07:11 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻