HarmonyOS鸿蒙Next中Native创建Bitmap并绘制一些图形,如何返回给ArkTs,上层做渲染
HarmonyOS鸿蒙Next中Native创建Bitmap并绘制一些图形,如何返回给ArkTs,上层做渲染 我想使用native生成一个Bitmap或者PixelMap然后传给ArkTS进行显示,应该如何去操作呢,如下我使用官方的API先生成一个Bitmap,然后在bitmap上绘制一个五角星,但是最后return的时候不知道该给ts如何返回数据,TS又该如何接收数据?
export const renderPage: () => ArrayBuffer;
static napi_value renderPage(napi_env env, napi_callback_info info) {
// 创建一个bitmap对象
OH_Drawing_Bitmap *cBitmap = OH_Drawing_BitmapCreate();
// 定义bitmap的像素格式
OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
// 构造对应格式的bitmap,width的值必须为 bufferHandle->stride / 4
OH_Drawing_BitmapBuild(cBitmap, 500, 500, &cFormat);
// 创建一个canvas对象
OH_Drawing_Canvas *cCanvas = OH_Drawing_CanvasCreate();
// 将画布与bitmap绑定,画布画的内容会输出到绑定的bitmap内存中
OH_Drawing_CanvasBind(cCanvas, cBitmap);
// 使用白色清除画布内容
OH_Drawing_CanvasClear(cCanvas, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0xFF, 0xFF));
int len = 500 / 4;
float aX = 500 / 2;
float aY = 500 / 4;
float dX = aX - len * std::sin(18.0f);
float dY = aY + len * std::cos(18.0f);
float cX = aX + len * std::sin(18.0f);
float cY = dY;
float bX = aX + (len / 2.0);
float bY = aY + std::sqrt((cX - dX) * (cX - dX) + (len / 2.0) * (len / 2.0));
float eX = aX - (len / 2.0);
float eY = bY;
// 创建一个path对象,然后使用接口连接成一个五角星形状
OH_Drawing_Path *cPath = OH_Drawing_PathCreate();
// 指定path的起始位置
OH_Drawing_PathMoveTo(cPath, aX, aY);
// 用直线连接到目标点
OH_Drawing_PathLineTo(cPath, bX, bY);
OH_Drawing_PathLineTo(cPath, cX, cY);
OH_Drawing_PathLineTo(cPath, dX, dY);
OH_Drawing_PathLineTo(cPath, eX, eY);
// 闭合形状,path绘制完毕
OH_Drawing_PathClose(cPath);
// 创建一个画笔Pen对象,Pen对象用于形状的边框线绘制
OH_Drawing_Pen *cPen = OH_Drawing_PenCreate();
OH_Drawing_PenSetAntiAlias(cPen, true);
OH_Drawing_PenSetColor(cPen, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00));
OH_Drawing_PenSetWidth(cPen, 10.0);
OH_Drawing_PenSetJoin(cPen, LINE_ROUND_JOIN);
// 将Pen画笔设置到canvas中
OH_Drawing_CanvasAttachPen(cCanvas, cPen);
// 创建一个画刷Brush对象,Brush对象用于形状的填充
OH_Drawing_Brush *cBrush = OH_Drawing_BrushCreate();
OH_Drawing_BrushSetColor(cBrush, OH_Drawing_ColorSetArgb(0xFF, 0x00, 0xFF, 0x00));
// 将Brush画刷设置到canvas中
OH_Drawing_CanvasAttachBrush(cCanvas, cBrush);
// 在画布上画path的形状,五角星的边框样式为pen设置,颜色填充为Brush设置
OH_Drawing_CanvasDrawPath(cCanvas, cPath);
return mBitmap;
}
更多关于HarmonyOS鸿蒙Next中Native创建Bitmap并绘制一些图形,如何返回给ArkTs,上层做渲染的实战教程也可以访问 https://www.itying.com/category-93-b0.html
您好,请您通过在线提单进一步解决:https://developer.huawei.com/consumer/cn/support/feedback/#/
感谢您的反馈与支持。
更多关于HarmonyOS鸿蒙Next中Native创建Bitmap并绘制一些图形,如何返回给ArkTs,上层做渲染的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
提单了,华为工程师看不懂我的问题,答非所问,
我也在关注该问题,没有找到方案
这个问题目前有没有解决方案?
void *pixels = OH_Drawing_BitmapGetPixels(cBitmap);
napi_value result;
napi_create_arraybuffer(env, 500 * 500 * 4, &pixels, &result);
return result;
后面改成这样也不行,拿不到图片
let arrayBuffer: ArrayBuffer = document.renderPage();
const imageSource = image.createImageSource(arrayBuffer)
imageSource.createPixelMap().then(pixelMap=>{
this.pxImage=pixelMap;
this.ondraw();
})
OH吗?OH要去看一下其他模块的注册机制,利用JSI把它返回去
在HarmonyOS鸿蒙Next中,Native层创建Bitmap并绘制图形后,可以通过NativeAPI
将其返回给ArkTS层进行渲染。具体步骤如下:
-
Native层创建Bitmap:使用
OH_NativeBuffer
或OH_NativeImage
等API在Native层创建Bitmap对象,并进行图形绘制。 -
将Bitmap传递给ArkTS层:通过
NativeAPI
将Bitmap对象转换为PixelMap
或Image
对象,并返回给ArkTS层。可以使用OH_NativeBuffer_GetNativeBuffer
或OH_NativeImage_GetNativeImage
等函数获取Native层的Bitmap数据,然后通过PixelMap
或Image
的构造函数将其封装为ArkTS可识别的对象。 -
ArkTS层渲染:在ArkTS层接收到
PixelMap
或Image
对象后,可以直接使用Image
组件进行渲染。例如,将Image
对象赋值给Image
组件的src
属性,ArkTS会自动处理渲染逻辑。
示例代码片段:
// Native层
OH_NativeBuffer* nativeBuffer = OH_NativeBuffer_Create(width, height, format);
// 绘制图形到nativeBuffer
OH_NativeBuffer* pixelMap = OH_NativeBuffer_GetNativeBuffer(nativeBuffer);
// ArkTS层
let image = new Image();
image.src = pixelMap; // pixelMap为Native层返回的PixelMap对象
在HarmonyOS鸿蒙Next中,Native层创建Bitmap并绘制图形后,可以通过OH_NativeBuffer
和OH_NativeImage
接口将Bitmap数据传递给ArkTS层。具体步骤如下:
- 创建Bitmap:在Native层使用
OH_NativeBuffer_Create
创建Buffer,并通过OH_NativeImage_Create
创建Image对象。 - 绘制图形:使用OpenGL或Vulkan等图形API在Image上绘制图形。
- 传递数据:将Image对象通过
OH_NativeImage_GetNativeBuffer
获取Buffer,并通过OH_NativeBuffer_Map
映射到内存,将数据传递给ArkTS层。 - 渲染:在ArkTS层使用
Image
组件接收并渲染Bitmap数据。
通过这种方式,可以实现Native层与ArkTS层的高效数据交互和渲染。