鸿蒙next开发:UI开发-构建布局(自定义绘制)
本文详细介绍了鸿蒙HarmonyOS应用开发中的自定义绘制功能。
往期鸿蒙全套实战文章必看:(附带鸿蒙全栈学习资料)
自定义绘制
当监听到注册的事件为绘制类型时,可通过自定义绘制功能执行绘制逻辑,自定义绘制的内容。
说明
在事件注册过程中,需将事件注册为绘制事件(如ARKUI_NODE_CUSTOM_EVENT_ON_DRAW),通过查阅ArkUI_NodeCustomEventType枚举值获取事件类型及含义。
若需实现自定义绘制逻辑,应自定义UserData,并在事件注册时进行传递。
-
自定义节点的创建,通过ArkUI_NativeNodeAPI_1的create接口,传入ARKUI_NODE_CUSTOM创建自定义节点。
auto customNode = nodeAPI->createNode(ARKUI_NODE_CUSTOM); -
在事件注册时将自定义节点、事件类型(例如ARKUI_NODE_CUSTOM_EVENT_ON_FOREGROUND_DRAW,获取NDK接口支持的事件类型范围可通过查询ArkUI_NodeCustomEventType枚举值)、事件ID和UserData作为参数传入。
//UserData struct A { int32_t a =6; bool flag = true; ArkUI_NodeHandle node; }; A *a = new A; a->node = customNode; nodeAPI->registerNodeCustomEvent(customNode,ARKUI_NODE_CUSTOM_EVENT_ON_FOREGROUND_DRAW,1,a); nodeAPI->registerNodeCustomEventReceiver([](ArkUI_NodeCustomEvent *event) { //事件回调函数逻辑 }); -
在回调函数中,获取自定义事件的事件类型(通过OH_ArkUI_NodeCustomEvent_GetEventType)、事件ID(通过OH_ArkUI_NodeCustomEvent_GetEventTargetId获取)、UserData(通过OH_ArkUI_NodeCustomEvent_GetUserData获取)进行判断,以执行不同的逻辑。
auto type = OH_ArkUI_NodeCustomEvent_GetEventType(event); auto targetId = OH_ArkUI_NodeCustomEvent_GetEventTargetId(event); auto userData =reinterpret_cast<A *>( OH_ArkUI_NodeCustomEvent_GetUserData(event)); -
OH_ArkUI_NodeCustomEvent_GetDrawContextInDraw通过自定义组件事件获取绘制上下文,并将其传入 OH_ArkUI_DrawContext_GetCanvas中以获取绘制canvas指针,该指针随后转换为OH_Drawing_Canvas指针进行绘制。
//获取自定事件绘制的上下文。 auto *drawContext = OH_ArkUI_NodeCustomEvent_GetDrawContextInDraw(event); //获取绘制canvas指针。 auto *canvas1 = OH_ArkUI_DrawContext_GetCanvas(drawContext); //转换为OH_Drawing_Canvas指针进行绘制。 OH_Drawing_Canvas *canvas = reinterpret_cast<OH_Drawing_Canvas *>(canvas1); //绘制逻辑。 int32_t width = 1000; int32_t height = 1000; auto path = OH_Drawing_PathCreate(); OH_Drawing_PathMoveTo(path, width / 4, height / 4); OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4); OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4); OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4); OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4); OH_Drawing_PathClose(path); auto pen = OH_Drawing_PenCreate(); OH_Drawing_PenSetWidth(pen, 10); OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00)); OH_Drawing_CanvasAttachPen(canvas, pen); OH_Drawing_CanvasDrawPath(canvas, path);完整示例:
ArkUI_NodeHandle test(ArkUI_NativeNodeAPI_1 *nodeAPI) {
//创建节点
auto column = nodeAPI->createNode(ARKUI_NODE_COLUMN);
auto customNode = nodeAPI->createNode(ARKUI_NODE_CUSTOM);
ArkUI_NumberValue value[] = {480};
ArkUI_AttributeItem item = {value, 1};
//属性设置
nodeAPI->setAttribute(column, NODE_WIDTH, &item);
value[0].i32 = 720;
nodeAPI->setAttribute(column, NODE_HEIGHT, &item);
ArkUI_NumberValue NODE_WIDTH_value[] = {200};
ArkUI_AttributeItem NODE_WIDTH_Item[] = {NODE_WIDTH_value, 1};
ArkUI_NumberValue NODE_HEIGHT_value[] = {200};
ArkUI_AttributeItem NODE_HEIGHT_Item[] = {NODE_HEIGHT_value, 1};
ArkUI_NumberValue NODE_BACKGROUND_COLOR_item_value[] = {{.u32 = 0xFFFFFF00}};
ArkUI_AttributeItem NODE_BACKGROUND_COLOR_Item[] = {NODE_BACKGROUND_COLOR_item_value, 1};
//自定义UserData。
struct A {
int32_t a =6;
bool flag = true;
ArkUI_NodeHandle node;
};
A *a = new A;
a->node = customNode;
nodeAPI->setAttribute(customNode, NODE_WIDTH, NODE_WIDTH_Item);
nodeAPI->setAttribute(customNode, NODE_HEIGHT, NODE_HEIGHT_Item);
nodeAPI->setAttribute(customNode, NODE_BACKGROUND_COLOR, NODE_BACKGROUND_COLOR_Item);
//进行事件注册
nodeAPI->registerNodeCustomEvent(customNode,ARKUI_NODE_CUSTOM_EVENT_ON_FOREGROUND_DRAW,1,a);
//事件回调函数的编写
nodeAPI->registerNodeCustomEventReceiver([](ArkUI_NodeCustomEvent *event) {
//获取自定义事件的相关信息。
auto type = OH_ArkUI_NodeCustomEvent_GetEventType(event);
auto targetId = OH_ArkUI_NodeCustomEvent_GetEventTargetId(event);
auto userData =reinterpret_cast<A *>( OH_ArkUI_NodeCustomEvent_GetUserData(event));
if (type == ARKUI_NODE_CUSTOM_EVENT_ON_FOREGROUND_DRAW && targetId == 1 && userData->flag) {
//获取自定事件绘制的上下文。
auto *drawContext = OH_ArkUI_NodeCustomEvent_GetDrawContextInDraw(event);
//获取绘制canvas指针。
auto *canvas1 = OH_ArkUI_DrawContext_GetCanvas(drawContext);
//转换为OH_Drawing_Canvas指针进行绘制。
OH_Drawing_Canvas *canvas = reinterpret_cast<OH_Drawing_Canvas *>(canvas1);
int32_t width = 1000;
int32_t height = 1000;
auto path = OH_Drawing_PathCreate();
OH_Drawing_PathMoveTo(path, width / 4, height / 4);
OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4);
OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4);
OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4);
OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4);
OH_Drawing_PathClose(path);
auto pen = OH_Drawing_PenCreate();
OH_Drawing_PenSetWidth(pen, 10);
OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00));
OH_Drawing_CanvasAttachPen(canvas, pen);
OH_Drawing_CanvasDrawPath(canvas, path);
}
});
//自定义节点上树
nodeAPI->addChild(column, customNode);
return column;
}

更多推荐



所有评论(0)