1# 监听组件布局和绘制送显事件 2<!--Kit: ArkUI--> 3<!--Subsystem: ArkUI--> 4<!--Owner: @pengzhiwen3--> 5<!--Designer: @lmleon--> 6<!--Tester: @fredyuan0912--> 7<!--Adviser: @HelloCrease--> 8 9从API version 16开始,NDK接口针对UI组件的布局或绘制送显完成,提供了注册与取消监听函数的方式。开发者可使用如下接口监听指定节点布局完成或者绘制送显完成的时机,并注册相应的回调函数。可使用[OH_ArkUI_RegisterLayoutCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_registerlayoutcallbackonnodehandle)注册组件布局完成的回调方法。可使用[OH_ArkUI_RegisterDrawCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_registerdrawcallbackonnodehandle)注册绘制送显完成的回调方法。可使用[OH_ArkUI_UnregisterLayoutCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_unregisterlayoutcallbackonnodehandle)取消组件布局完成的回调方法注册。可使用[OH_ArkUI_UnregisterDrawCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_unregisterdrawcallbackonnodehandle)取消绘制送显完成的回调方法注册。 10 11 12> **说明:** 13> [OH_ArkUI_RegisterLayoutCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_registerlayoutcallbackonnodehandle)和[OH_ArkUI_RegisterDrawCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_registerdrawcallbackonnodehandle)能够监听组件的布局完成或者绘制送显完成事件触发,但只能传递一个函数指针,多次调用使用最后一次的函数指针进行回调。 14 15 16以下示例基于[接入ArkTS页面](ndk-access-the-arkts-page.md)章节,补充相关事件监听。 17在ArkUITextNode对象中实现布局或者绘制送显完成事件注册逻辑。 18```c 19// ArkUITextNode.h 20// 实现文本组件的封装类。 21 22#ifndef MYAPPLICATION_ARKUITEXTNODE_H 23#define MYAPPLICATION_ARKUITEXTNODE_H 24 25#include <arkui/native_type.h> 26#include <arkui/native_node.h> 27#include <hilog/log.h> 28#include "ArkUINode.h" 29#include <string> 30 31namespace NativeModule { 32const unsigned int LOG_PRINT_DOMAIN = 0xFF00; 33// 布局完成的回调方法 34void OnLayoutCompleted(void* userData) { 35 ArkUI_NodeHandle node = (ArkUI_NodeHandle)userData; 36 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "the text_node is layout completed"); 37 ArkUI_NativeNodeAPI_1 *nativeModule = NativeModuleInstance::GetInstance()->GetNativeNodeAPI(); 38 ArkUI_AttributeItem item = {nullptr, 0, "layout callback"}; 39 nativeModule->setAttribute(node, NODE_TEXT_CONTENT, &item); 40} 41// 绘制送显完成的回调方法 42void OnDrawCompleted(void* userData) { 43 ArkUI_NodeHandle node = (ArkUI_NodeHandle)userData; 44 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "the text_node is draw completed"); 45 ArkUI_NativeNodeAPI_1 *nativeModule = NativeModuleInstance::GetInstance()->GetNativeNodeAPI(); 46 ArkUI_AttributeItem item = {nullptr, 0, "draw callback"}; 47 nativeModule->setAttribute(node, NODE_TEXT_CONTENT, &item); 48} 49 50class ArkUITextNode : public ArkUINode { 51public: 52 ArkUITextNode() 53 : ArkUINode((NativeModuleInstance::GetInstance()->GetNativeNodeAPI())->createNode(ARKUI_NODE_TEXT)) {} 54 void SetFontSize(float fontSize) { 55 assert(handle_); 56 ArkUI_NumberValue value[] = {{.f32 = fontSize}}; 57 ArkUI_AttributeItem item = {value, 1}; 58 nativeModule_->setAttribute(handle_, NODE_FONT_SIZE, &item); 59 } 60 void SetFontColor(uint32_t color) { 61 assert(handle_); 62 ArkUI_NumberValue value[] = {{.u32 = color}}; 63 ArkUI_AttributeItem item = {value, 1}; 64 nativeModule_->setAttribute(handle_, NODE_FONT_COLOR, &item); 65 } 66 void SetTextContent(const std::string &content) { 67 assert(handle_); 68 ArkUI_AttributeItem item = {nullptr, 0, content.c_str()}; 69 nativeModule_->setAttribute(handle_, NODE_TEXT_CONTENT, &item); 70 } 71 void SetTextAlign(ArkUI_TextAlignment align) { 72 assert(handle_); 73 ArkUI_NumberValue value[] = {{.i32 = align}}; 74 ArkUI_AttributeItem item = {value, 1}; 75 nativeModule_->setAttribute(handle_, NODE_TEXT_ALIGN, &item); 76 } 77 void SetLayoutCallBack(int32_t nodeId) { 78 assert(handle_); 79 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "set layout callback"); 80 // 注册布局完成的回调方法 81 OH_ArkUI_RegisterLayoutCallbackOnNodeHandle(handle_, this, OnLayoutCompleted); 82 } 83 void ResetLayoutCallBack() { 84 assert(handle_); 85 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "reset layout callback"); 86 // 取消注册布局完成的回调方法 87 OH_ArkUI_UnregisterLayoutCallbackOnNodeHandle(handle_); 88 } 89 void SetDrawCallBack(int32_t nodeId) { 90 assert(handle_); 91 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "set draw callback"); 92 // 注册绘制送显完成的回调方法 93 OH_ArkUI_RegisterDrawCallbackOnNodeHandle(handle_, this, OnDrawCompleted); 94 } 95 void ResetDrawCallBack() { 96 assert(handle_); 97 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "reset draw callback"); 98 // 取消注册绘制送显完成的回调方法 99 OH_ArkUI_UnregisterDrawCallbackOnNodeHandle(handle_); 100 } 101 void SetInspectorId(std::string inspectorId) { 102 ArkUI_AttributeItem item = {nullptr, 0, inspectorId.c_str()}; 103 nativeModule_->setAttribute(handle_, NODE_ID, &item); 104 } 105}; 106} // namespace NativeModule 107 108#endif // MYAPPLICATION_ARKUITEXTNODE_H 109``` 110 111```c 112// NormalTextListExample.h 113// 自定义NDK接口入口函数。 114 115#ifndef MYAPPLICATION_NORMALTEXTLISTEXAMPLE_H 116#define MYAPPLICATION_NORMALTEXTLISTEXAMPLE_H 117 118#include "ArkUIBaseNode.h" 119#include "ArkUIListItemNode.h" 120#include "ArkUIListNode.h" 121#include "ArkUITextNode.h" 122#include <hilog/log.h> 123 124namespace NativeModule { 125 126std::shared_ptr<ArkUIBaseNode> CreateTextListExample() { 127 // 创建组件并挂载 128 // 1:使用智能指针创建List组件。 129 auto list = std::make_shared<ArkUIListNode>(); 130 list->SetPercentWidth(1); 131 list->SetPercentHeight(1); 132 // 2:创建ListItem子组件并挂载到List上。 133 for (int32_t i = 0; i < 1; ++i) { 134 auto listItem = std::make_shared<ArkUIListItemNode>(); 135 auto textNode = std::make_shared<ArkUITextNode>(); 136 textNode->SetTextContent(std::to_string(i)); 137 textNode->SetFontSize(16); 138 textNode->SetPercentWidth(1); 139 textNode->SetHeight(100); 140 textNode->SetBackgroundColor(0xFFfffacd); 141 textNode->SetTextAlign(ARKUI_TEXT_ALIGNMENT_CENTER); 142 // 在当前节点注册布局回调 143 textNode->SetLayoutCallBack(i); 144 // 在当前节点注册绘制送显回调 145 textNode->SetDrawCallBack(i); 146 listItem->AddChild(textNode); 147 list->AddChild(listItem); 148 } 149 return list; 150} 151} // namespace NativeModule 152 153#endif // MYAPPLICATION_NORMALTEXTLISTEXAMPLE_H 154```