今年接了个智能终端项目,主系统是 OpenHarmony,跑在瑞芯微 rk3568 和 rk3588 两块开发板上。需求里有一个很常见的交互:一张可拖拽卡片,手指按住后可以左右平移滑动,滑过阈值松手就飞出屏幕,没到阈值就回弹归位。这类效果在 React Native 里用 Animated 配合 PanResponder 写是标准操作,但到了 OpenHarmony 环境里,问题就不再"标准"了:RN 社区默认你跑在 Android 或 iOS 上,而上层 UI 实际映射到的是完全不同的 ArkUI 渲染体系。
这篇文章把我完整跑通"在 OpenHarmony 上用 React Native 实现 Animated 平移滑动效果"的整个过程整理出来,包括工程初始化、真机部署、Animated 在这套环境下的行为边界、一个可以直接抄走的 SwipeCard 组件,以及在 rk3568/rk3588 上调帧率的实测经验。适合两类人看:一类是正在评估要不要在 OpenHarmony 项目里引入 RN 的团队,另一类是在 RNOH 上已经开始写业务、但被动画或真机调试卡住的前端开发。
1. 为什么在 OpenHarmony 上还要用 React Native
1.1 一个很实际的项目背景
我们当时面临的是一个典型的"存量资产 + 新平台"场景。团队里大部分业务页面是用 React Native 写的,覆盖了已有的 Android 和 iOS 两个平台。OpenHarmony 这套系统是新增目标,业务方不可能接受把这几十个页面全部用 ArkTS 重写一遍,那样人力成本和时间成本都不可控。
所以在项目启动前,我们做了两个方向的评估:一是全部用 ArkTS/ArkUI 原生开发,二是用 RNOH 把现有 RN 代码迁移过来。最终选择后者的核心原因只有一条:能用一份业务代码覆盖更多平台,后续维护成本最低。代价也很明确,就是需要接受 RNOH 生态不如 Android/iOS 成熟,遇到问题得自己往下挖。
如果你们团队是从零开始做 OpenHarmony 原生应用,前端没有存量 RN 代码,我反而建议优先考虑 ArkTS,没有必要为了跨平台而跨平台。
1.2 RNOH 是什么,不是"套壳浏览器"
RNOH 的全称是 React Native OpenHarmony,是 OpenHarmony 社区维护的一个开源移植项目,核心包名是 @react-native-oh/react-native-harmony。它的工作原理可以简化理解成:复用 React Native 的 JS 层框架和组件模型,通过一层 C++/ArkTS 适配层把 RN 的组件树映射到 ArkUI 的组件树上。
也就是说,你在 RN 里写 <View>、<Text>,到 OpenHarmony 设备上渲染出来的实际上是对应的 ArkUI 组件,而不是像 WebView 套壳那样渲染 HTML。也正因如此,React Native 的 Animated 动画 API 才能在语义上基本保持一致,平移、旋转、透明度这些常规动画都能跑起来,只是底层驱动链路和 Android 上有差异,这个差异我在后面专门讲。
1.3 选型判断:什么项目适合 RNOH
做选型时不要只看"能不能跑通 Demo",要拿真实业务场景过一遍。我整理了一张简单的对照表,基本能覆盖大多数项目的判断:
| 维度 | 适合用 RNOH | 建议直接用 ArkUI |
|---|---|---|
| 团队技能栈 | 前端 / RN 为主 | ArkTS 熟练 |
| 存量资产 | 已有 RN 代码库或组件库 | 全新项目,无复用资产 |
| 交互复杂度 | 常规页面、列表、表单、有限动画 | 重度复杂动画、性能极限场景 |
| 第三方依赖 | 以纯 JS 库为主(axios、lodash 等) | 强依赖系统级能力(USB、串口、蓝牙底层定制) |
| 时间预算 | 有 1~2 周适配缓冲期 | 两周内必须交付上线 |
这里有个关键提醒:RNOH 目前对系统级能力的封装远不如 Android 丰富。像 USB、串口这类能力,如果项目里要用,基本得自己封装 Native Module,这是一个很大的变量,一定要在排期里留足时间,否则很容易翻车。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 工程初始化与真机部署:从空工程到 rk3568 亮屏
2.1 初始化 RNOH 工程
RNOH 的工程结构跟普通 RN 项目不太一样。它不是直接 react-native init 就能得到 OpenHarmony 工程,而是会创建一个包含 harmony 目录作为原生壳工程的项目结构。
我当时是这样初始化的,命令细节不同版本可能有差异,具体以官方仓库当前文档为准:
bash复制# 用官方脚手架创建工程
npx @react-native-oh/react-native-harmony@latest init MyProject
cd MyProject
npm install
初始化完成后,项目里会有两个关键部分:App.tsx 这类 RN 业务代码,以及一个 harmony 目录,里面是 OpenHarmony 侧的 entry 模块。接下来用 DevEco Studio 打开 harmony 目录,等 SDk 同步和依赖解析完成。这一步经常因为网络原因卡住,建议先把 npm 和 ohpm 的镜像源配好,会省很多时间。
安装依赖需要注意版本匹配。RN 核心库 react-native 的版本号和 RNOH 的版本号必须对齐,比如 RN 0.72.x 对应的 RNOH 也是 0.72.x 系列,混用会导致白屏或启动崩溃。检查 package.json 时不要只盯着 react-native,@react-native-oh/react-native-harmony 的 version 也要一起看。
2.2 签名、hap 与 hdc 真机部署
OpenHarm
