基于 OpenGL/GLSL 的原生 Canvas 2D/WebGL 组件,提供高性能绘图能力
Access rate limit exceeded. Please log in to continue.
react-native-gcanvas
本项目基于 @flyskywhy/react-native-gcanvas开发。如果在使用过程中有任何问题,欢迎在AtomGit提交Issue,会及时跟进。
项目介绍
@hxa-rn/react-native-gcanvas 是 @flyskywhy/react-native-gcanvas@6.0.24 的鸿蒙适配包,提供基于 C++ GCanvas(OpenGL ES)引擎的 Canvas 2D / WebGL 原生视图。业务侧通过 harmony.alias 继续 import ... from '@flyskywhy/react-native-gcanvas'。
本包含原生实现:C++ TurboModule GCanvasModule(20 个方法)+ Fabric 组件 GCanvasView(XComponent SURFACE + EGL)。JS 层复用上游命令字符串桥,鸿蒙侧补齐 texImage2D / texSubImage2D、registerFont / getFontNames 与远程图片下载。
当前版本:6.0.28。
集成指南
npm install @hxa-rn/react-native-gcanvas
本包声明:
{
"name": "@hxa-rn/react-native-gcanvas",
"version": "6.0.28",
"peerDependencies": {
"react-native": ">=0.72"
},
"harmony": {
"alias": "@flyskywhy/react-native-gcanvas"
}
}
工程按 harmony.alias 解析后,业务代码仍从原包名导入:
import {GCanvasView, GImage, createCanvas, getFontNames, registerFont} from '@flyskywhy/react-native-gcanvas';
peerDependencies 为 react-native >= 0.72。本模块含 C++ TurboModule 与 Fabric 组件。Autolinking 可用时跳过手动注册;手动接入时需同时注册 C++ GcanvasPackage 与 ETS GcanvasPackage,并把 harmony/gcanvas.har 加入 entry 依赖。
使用说明
import React from 'react';
import {StyleSheet, View} from 'react-native';
import {GCanvasView} from '@flyskywhy/react-native-gcanvas';
export default function App() {
return (
<View style={styles.container}>
<GCanvasView
style={styles.canvas}
onCanvasCreate={(canvas) => {
const ctx = canvas.getContext('2d');
ctx.fillStyle = '#FF5722';
ctx.fillRect(10, 10, 100, 100);
ctx.font = '24px';
ctx.fillStyle = '#222222';
ctx.fillText('Hello GCanvas', 10, 160);
}}
onIsReady={(value) => {
console.log('canvas ready:', value);
}}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {flex: 1},
canvas: {width: 300, height: 200},
});
onCanvasCreate 拿到 canvas 后即可 getContext('2d'|'webgl')。toDataURL 同步返回 data:image/png;base64,...。registerFont(src, fontFace?) 在鸿蒙已开通,随后可用 getFontNames() 查看枚举结果。加载远程图片时须在 module.json5 声明 ohos.permission.INTERNET。
接口文档
导出
| 名称 | 类型 | 说明 |
|---|---|---|
GCanvasView |
React 组件 | Canvas 2D / WebGL 原生视图 |
GImage |
类 | 图片对象,走 preLoadImage |
createCanvas(width, height) |
函数 | 创建离屏 Canvas |
getFontNames() |
函数 | 返回系统可用字体名数组 |
registerFont(src, fontFace?) |
函数 | 注册自定义字体(鸿蒙已开通) |
<GCanvasView> Props / 事件
| 名称 | 类型 | 说明 |
|---|---|---|
isGestureResponsible |
boolean | 是否响应画布内手势,默认 true |
isAutoClearRectBeforePutImageData |
boolean | putImageData 前是否先 clear,仅 2D |
isResetGlViewportAfterSetWidthOrHeight |
boolean | 宽高变化后是否重置 viewport |
devicePixelRatio |
number | 未传时使用 PixelRatio.get() |
offscreenCanvas |
boolean | 是否可作为 document.createElement('canvas') 离屏画布 |
disableAutoSwap |
boolean | 关闭 WebGL 自动 swap |
onCanvasCreate |
(canvas) => void |
画布对象就绪 |
onCanvasResize |
({width, height, canvas}) => void |
视图尺寸变化 |
onIsReady |
(value) => void |
GL surface 就绪 / 销毁 |
onMouseDown / onMouseMove / onMouseUp |
(e) => void |
触摸转 PointerEvent |
Canvas / 上下文
| API | 说明 |
|---|---|
canvas.getContext('2d' | 'webgl') |
取得 2D 或 WebGL 上下文 |
canvas.toDataURL(mimeType, quality) |
同步导出 Base64 |
canvas.reset() |
调用原生 resetComponent |
2D:fillRect / strokeRect / clearRect / fill / stroke / arc |
矩形与路径 |
2D:fillText / strokeText / measureText |
文本 |
2D:createLinearGradient / createRadialGradient / createPattern |
渐变与图案 |
2D:scale / rotate / translate / save / restore |
变换 |
2D:drawImage / getImageData / putImageData |
图片与像素 |
WebGL:createShader / compileShader / texImage2D / drawArrays 等 |
WebGL 1.0 |
TurboModule GCanvasModule(经 JS 桥内部调用)
| 方法 | 同步 | 说明 |
|---|---|---|
enable / disable / resetComponent |
混合同步 | 画布生命周期 |
extendCallNative |
同步 | 命令字符串执行并返回结果 |
render |
异步 | 命令字符串投递后立即返回 |
setContextType / setDevicePixelRatio / resetGlViewport |
同步 | 上下文与视口 |
toDataURL |
同步 | glReadPixels → PNG → base64 |
preLoadImage / bindImageTexture |
异步 | 图片解码与纹理绑定 |
texImage2D / texSubImage2D |
同步 | WebGL 纹理上传 |
getFontNames / addFontFamily / setExtraFontLocation |
同步 | 字体 |
setAlpha |
异步 | 空壳,对齐 Android/iOS,不产生实际透明度 |
快速验证(运行 Example)
前置条件
| 依赖 | 版本要求 |
|---|---|
| Node.js | >= 18 |
| DevEco Studio | 5.0+ / 6.0+ |
| HarmonyOS SDK | API 12+ |
运行步骤
1. 克隆仓库
git clone https://gitcode.com/hxa-rn/react-native-gcanvas.git
cd react-native-gcanvas
git checkout main
2. 安装仓库开发依赖
npm install --legacy-peer-deps
Example 已改为从 npm 公仓安装 @hxa-rn/react-native-gcanvas@6.0.28,不再使用本地 file:../xxx.tgz,运行 Example 不必再执行 npm pack。
3. 进入 example 目录,安装依赖
cd example
npm install --legacy-peer-deps
4. 生成 JS Bundle
npm run dev
产物:harmony/entry/src/main/resources/rawfile/bundle.harmony.js
5. 用 DevEco Studio 打开鸿蒙工程
- 打开 DevEco Studio
- 选择
example/harmony目录 - 等待 Sync 完成
6. 编译并运行 HAP
在 DevEco Studio 中点击运行按钮,将 HAP 安装到设备/模拟器。
注意:Example 中已预置插件依赖和 Package 注册,无需手动配置 Link。
约束与限制
- 兼容性:Demo
compatibleSdkVersion为5.0.1(13);react-native>= 0.72;RNOH 0.72+;HarmonyOS API 12+(适配构建环境为 API 13)。 - 权限:加载远程
http(s)图片时需在应用module.json5声明ohos.permission.INTERNET。库模块本身无额外系统权限。 - 远程图片:鸿蒙
image.createImageSource不接受 http URL,须先经@ohos.net.http下载。 setAlpha:空实现,对齐 Android/iOS 原空壳语义。getImageData/measureText:走execWithoutDisplay,读完后需再绘制才能上屏。- 真机渲染:2D / WebGL 实际画面、字形与远程图片效果需在设备上确认。
开源license
本项目基于 Apache-2.0 协议,详见 LICENSE 文件。
问题反馈渠道
欢迎在 AtomGit 提交 Issue。也可在 GitCode 仓库反馈: