• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Listening for Component Layout and Drawing Events
2
3
4Since API version 16, NDK APIs provides functions for registering and unregistering callbacks for UI component layout completion and drawing completion events. You can use the following APIs to listen for when specific node layouts are completed or when drawing is finished, and register corresponding callbacks: Use [OH_ArkUI_RegisterLayoutCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_registerlayoutcallbackonnodehandle) to register a layout completion callback. Use [OH_ArkUI_RegisterDrawCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_registerdrawcallbackonnodehandle) to register a drawing completion callback. Use [OH_ArkUI_UnregisterLayoutCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_unregisterlayoutcallbackonnodehandle) to unregister a layout completion callback. Use [OH_ArkUI_UnregisterDrawCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_unregisterdrawcallbackonnodehandle) to unregister a drawing completion callback.
5
6
7> **NOTE**
8>
9> [OH_ArkUI_RegisterLayoutCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_registerlayoutcallbackonnodehandle) and [OH_ArkUI_RegisterDrawCallbackOnNodeHandle](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_registerdrawcallbackonnodehandle) can be used to listen for component layout completion or drawing completion events, but only one function pointer can be registered, which means subsequent calls will overwrite the previous callbacks.
10
11
12The following example is based on the [Integrating with ArkTS Pages](ndk-access-the-arkts-page.md) section, supplementing related event listening.
13It implements layout and drawing completion event registration logic in the **ArkUITextNode** object.
14```c
15// ArkUITextNode.h
16// Implement an encapsulation class for the text component.
17
18#ifndef MYAPPLICATION_ARKUITEXTNODE_H
19#define MYAPPLICATION_ARKUITEXTNODE_H
20
21#include <arkui/native_type.h>
22#include <arkui/native_node.h>
23#include "ArkUINode.h"
24#include <string>
25
26namespace NativeModule {
27// Layout completion callback
28void OnLayoutCompleted(void* userData) {
29    ArkUI_NodeHandle node = (ArkUI_NodeHandle)userData;
30    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "the text_node is layout completed");
31    ArkUI_NativeNodeAPI_1 *nativeModule = NativeModuleInstance::GetInstance()->GetNativeNodeAPI();
32    ArkUI_AttributeItem item = {nullptr, 0, "layout callback"};
33    nativeModule->setAttribute(node, NODE_TEXT_CONTENT, &item);
34}
35// Drawing completion callback
36void OnDrawCompleted(void* userData) {
37    ArkUI_NodeHandle node = (ArkUI_NodeHandle)userData;
38    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "the text_node is draw completed");
39    ArkUI_NativeNodeAPI_1 *nativeModule = NativeModuleInstance::GetInstance()->GetNativeNodeAPI();
40    ArkUI_AttributeItem item = {nullptr, 0, "draw callback"};
41    nativeModule->setAttribute(node, NODE_TEXT_CONTENT, &item);
42}
43
44class ArkUITextNode : public ArkUINode {
45public:
46    ArkUITextNode()
47        : ArkUINode((NativeModuleInstance::GetInstance()->GetNativeNodeAPI())->createNode(ARKUI_NODE_TEXT)) {}
48    void SetFontSize(float fontSize) {
49        assert(handle_);
50        ArkUI_NumberValue value[] = {{.f32 = fontSize}};
51        ArkUI_AttributeItem item = {value, 1};
52        nativeModule_->setAttribute(handle_, NODE_FONT_SIZE, &item);
53    }
54    void SetFontColor(uint32_t color) {
55        assert(handle_);
56        ArkUI_NumberValue value[] = {{.u32 = color}};
57        ArkUI_AttributeItem item = {value, 1};
58        nativeModule_->setAttribute(handle_, NODE_FONT_COLOR, &item);
59    }
60    void SetTextContent(const std::string &content) {
61        assert(handle_);
62        ArkUI_AttributeItem item = {nullptr, 0, content.c_str()};
63        nativeModule_->setAttribute(handle_, NODE_TEXT_CONTENT, &item);
64    }
65    void SetTextAlign(ArkUI_TextAlignment align) {
66        assert(handle_);
67        ArkUI_NumberValue value[] = {{.i32 = align}};
68        ArkUI_AttributeItem item = {value, 1};
69        nativeModule_->setAttribute(handle_, NODE_TEXT_ALIGN, &item);
70    }
71    void SetLayoutCallBack(int32_t nodeId) {
72        assert(handle_);
73        nodeId_ = nodeId;
74        OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "set layout callback");
75        // Register a layout completion callback.
76        OH_ArkUI_RegisterLayoutCallbackOnNodeHandle(handle_, this, OnLayoutCompleted);
77    }
78    void ResetLayoutCallBack() {
79        assert(handle_);
80        OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "reset layout callback");
81        // Unregister the layout completion callback.
82        OH_ArkUI_UnregisterLayoutCallbackOnNodeHandle(handle_);
83    }
84    void SetDrawCallBack(int32_t nodeId) {
85        assert(handle_);
86        nodeId_ = nodeId;
87        OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "set draw callback");
88        // Register a drawing completion callback.
89        OH_ArkUI_RegisterDrawCallbackOnNodeHandle(handle_, this, OnDrawCompleted);
90    }
91    void ResetDrawCallBack() {
92        assert(handle_);
93        OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Callback", "reset draw callback");
94        // Unregister the drawing completion callback.
95        OH_ArkUI_UnregisterDrawCallbackOnNodeHandle(handle_);
96    }
97    void SetInspectorId(std::string inspectorId) {
98        ArkUI_AttributeItem item = {nullptr, 0, inspectorId.c_str()};
99        nativeModule_->setAttribute(handle_, NODE_ID, &item);
100    }
101};
102} // namespace NativeModule
103
104#endif // MYAPPLICATION_ARKUITEXTNODE_H
105```
106<!--no_check-->