* Copyright (c) 2025 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <arkui/native_animate.h>
#include <arkui/native_node_napi.h>
#include <ArkUICustomNode.h>
#include <arkui/native_render.h>
#include <hilog/log.h>
#include <js_native_api.h>
#include <CreateNode.h>
#include "ArkUIColumnNode.h"
#include "ArkUITextNode.h"
#include "NativeEntry.h"
#include <map>
#include <native_drawing/drawing_canvas.h>
#include <native_drawing/drawing_path.h>
#include <native_drawing/drawing_pen.h>
#include <thread>
namespace NativeModule {
#define FRAMEWORK_NODE_TREE_NUMBER 4
#define USER_NODE_TREE_NUMBER 3
struct AsyncData {
napi_env env;
std::shared_ptr<ArkUINode> parent = nullptr;
std::shared_ptr<ArkUINode> child = nullptr;
std::string label = "";
};
struct RenderNodeAnimationData {
std::weak_ptr<ArkUIRenderNode> renderNode;
ArkUI_AnimateOption *option = nullptr;
};
std::map<ArkUI_NodeContentHandle, std::shared_ptr<ArkUIBaseNode>> g_nodeMap;
ArkUI_ContextHandle g_contextHandle = nullptr;
float g_contentWidth = 400;
float g_contentHeight = 600;
float g_numBigSize = 1000;
float g_num20 = 20;
float g_num100 = 100;
float g_num150 = 150;
float g_num200 = 200;
float g_num300 = 300;
float g_num600 = 600;
std::shared_ptr<ArkUIBaseNode> CreateRenderNodeTreeExample(ArkUI_NativeNodeAPI_1 *nodeAPI)
{
auto rootNode = std::make_shared<ArkUIColumnNode>();
rootNode->SetWidth(g_num300);
rootNode->SetHeight(g_num600);
auto column = std::make_shared<ArkUIColumnNode>();
auto text = std::make_shared<ArkUITextNode>();
text->SetTextContent("查看日志打印,确认renderNode上树情况");
auto Custom = std::make_shared<ArkUICustomNode>();
auto rsNodeRoot = std::make_shared<ArkUIRenderNode>();
auto rsNodeFirstChild = std::make_shared<ArkUIRenderNode>();
auto rsNodeSecondChild = std::make_shared<ArkUIRenderNode>();
auto rsNodeThirdChild = std::make_shared<ArkUIRenderNode>();
auto result = column->AddRenderNode(rsNodeRoot);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_NodeUtils_AddRenderNode test001 result=%{public}d", result);
result = Custom->AddRenderNode(rsNodeRoot);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_NodeUtils_AddRenderNode test002 result=%{public}d", result);
result = Custom->AddRenderNode(rsNodeRoot);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_NodeUtils_AddRenderNode test003 result=%{public}d", result);
result = Custom->RemoveRenderNode(rsNodeRoot);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_NodeUtils_RemoveRenderNode test001 result=%{public}d", result);
result = Custom->AddRenderNode(rsNodeRoot);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_NodeUtils_AddRenderNode test004 result=%{public}d", result);
int32_t count = rsNodeRoot->GetChildrenCount();
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetChildrenCount test001 count=%{public}d", count);
result = rsNodeRoot->AddChild(rsNodeFirstChild);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_AddChild test002 result=%{public}d", result);
count = rsNodeRoot->GetChildrenCount();
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetChildrenCount test002 count=%{public}d", count);
result = rsNodeRoot->AddChild(rsNodeSecondChild);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_AddChild test003 result=%{public}d", result);
count = rsNodeRoot->GetChildrenCount();
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetChildrenCount test003 count=%{public}d", count);
result = rsNodeRoot->RemoveChild(rsNodeSecondChild);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_RemoveChild test001 result=%{public}d", result);
count = rsNodeRoot->GetChildrenCount();
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_RemoveChild test002 count=%{public}d", count);
result = Custom->Invalidate();
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_Invalidate test002 except-result=0 - %{public}d", result);
result = rsNodeRoot->SetSize(-1, 1);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager", "error test001 count=106405-%{public}d", result);
rsNodeRoot->SetSize(300, 300);
rsNodeRoot->SetBackgroundColor(0xFFFFFFFF);
rsNodeFirstChild->SetSize(g_num100, g_num100);
rsNodeSecondChild->SetSize(200, 200);
rsNodeThirdChild->SetSize(250, 250);
rsNodeRoot->AddChild(rsNodeThirdChild);
count = rsNodeRoot->GetChildrenCount();
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_AddChild test004 count=2-%{public}d", count);
result = rsNodeRoot->InsertChildAfter(rsNodeSecondChild, rsNodeFirstChild);
count = rsNodeRoot->GetChildrenCount();
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_InsertChildAfter test001 count=3-%{public}d", count);
Custom->SetWidth(g_num300);
Custom->SetHeight(g_num600);
column->AddChild(text);
column->AddChild(Custom);
rootNode->AddChild(column);
return rootNode;
}
void SetBaseProperty(const std::shared_ptr<ArkUIBaseNode>& column, const std::shared_ptr<ArkUIRenderNode>& renderNode,
std::string textContent)
{
auto Custom = std::make_shared<ArkUICustomNode>();
Custom->SetWidth(g_num100);
Custom->SetHeight(g_num100);
renderNode->SetSize(g_num150, g_num150);
renderNode->SetBackgroundColor(0xFFFF00FF);
auto result = Custom->AddRenderNode(renderNode);
auto text = std::make_shared<ArkUITextNode>();
text->SetTextContent(textContent);
column->AddChild(text);
column->AddChild(Custom);
}
std::shared_ptr<ArkUIBaseNode> testRenderNodeProperty(ArkUI_NativeNodeAPI_1 *nodeAPI)
{
auto scroll = std::make_shared<ArkUIScrollNode>();
scroll->SetWidth(g_contentWidth);
scroll->SetHeight(g_contentHeight);
scroll->SetBackgroundColor(0xff00F100);
auto column = std::make_shared<ArkUIColumnNode>();
auto text = std::make_shared<ArkUITextNode>();
text->SetWidth(g_num100);
text->SetHeight(g_num100);
text->SetTextContent("RenderNode 属性设置表现");
column->AddChild(text);
scroll->AddChild(column);
auto rsNode0 = std::make_shared<ArkUIRenderNode>();
int32_t clipToFrameResult = true;
SetBaseProperty(column, rsNode0, "测试clipToFrame");
auto result = rsNode0->SetClipToFrame(true);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetClipToFrame result=%{public}d", result);
result = rsNode0->GetClipToFrame(&clipToFrameResult);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetClipToFrame test002 result=%{public}d, clipToFrame=%{public}d", result,
clipToFrameResult);
uint32_t backgroundColor = 0;
auto rsNode1 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode1, "测试backGroundColor");
result = rsNode1->SetBackgroundColor(0xFF0000FF);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetBackgroundColor result=%{public}d", result);
result = rsNode1->GetBackgroundColor(&backgroundColor);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetBackgroundColor result=%{public}d, backgroundColor=%{public}d", result,
backgroundColor);
int32_t positionX = 0;
int32_t positionY = 0;
auto rsNode2 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode2, "测试position");
result = rsNode2->SetPosition(g_num200, g_num200);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetPosition result=%{public}d", result);
result = rsNode2->GetPosition(&positionX, &positionY);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetPosition result=%{public}d, x=%{public}d , y=%{public}d", result,
positionX, positionY);
int32_t clipToBounds = 0;
auto rsNode3 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode3, "测试clipToBounds");
result = rsNode3->SetClipToBounds(true);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetClipToBounds result=%{public}d", clipToBounds);
result = rsNode3->GetClipToBounds(&clipToBounds);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetClipToBounds result=%{public}d, clipToBounds=%{public}d", result,
clipToBounds);
float opacity = 0;
auto rsNode4 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode4, "测试opacity");
result = rsNode4->SetOpacity(1);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetOpacity result=%{public}d", result);
result = rsNode4->GetOpacity(&opacity);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetOpacity result=%{public}d, opacity=%{public}f", result, opacity);
int32_t sizeWidth = 0;
int32_t sizeHeight = 0;
auto rsNode5 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode5, "测试size");
result = rsNode5->SetSize(g_num200, g_num200);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager", "OH_ArkUI_RenderNodeUtils_SetSize result=%{public}d",
result);
result = rsNode5->GetSize(&sizeWidth, &sizeHeight);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetSize result=%{public}d, width=%{public}d, height=%{public}d", result,
sizeWidth, sizeHeight);
float pivotX = 0;
float pivotY = 0;
auto rsNode6 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode6, "测试pivot");
result = rsNode6->GetPivot(&pivotX, &pivotY);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetPivot1 result=%{public}d, x=%{public}f , y=%{public}f", result, pivotX,
pivotY);
result = rsNode6->SetPivot(g_num200, g_num100);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetPivot2 result=%{public}d", result);
result = rsNode6->GetPivot(&pivotX, &pivotY);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetPivot3 result=%{public}d, x=%{public}f , y=%{public}f", result, pivotX,
pivotY);
float scaleX = 0;
float scaleY = 0;
auto rsNode7 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode7, "测试scale");
result = rsNode7->SetScale(1.5, 1.5);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager", "OH_ArkUI_RenderNodeUtils_SetScale result=%{public}d",
result);
result = rsNode7->GetScale(&scaleX, &scaleY);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetScale result=%{public}d, x=%{public}f , y=%{public}f", result, scaleX,
scaleY);
float translationX = 0;
float translationY = 0;
auto rsNode8 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode8, "测试translation");
result = rsNode8->SetTranslation(30, 60);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetTranslation result=%{public}d", result);
result = rsNode8->GetTranslation(&translationX, &translationY);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetTranslation result=%{public}d, x=%{public}f , y=%{public}f", result,
translationX, translationY);
float rotationX = 0;
float rotationY = 0;
float rotationZ = 0;
auto rsNode9 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode9, "测试rotation");
result = rsNode9->SetRotation(60, 150, 30);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetRotation result=%{public}d", result);
result = rsNode9->GetRotation(&rotationX, &rotationY, &rotationZ);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetRotation result=%{public}d, x=%{public}f , y=%{public}f , z=%{public}f",
result, rotationX, rotationY, rotationZ);
auto rsNode10 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode10, "测试transform");
float matrix[] = {0.866, 0.433, -0.25, 0, 0, 0.866, 0.5, 0, 0.5, -0.25, 0.866, 0,
30, 30, 0, 1};
result = rsNode10->SetTransform(matrix);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetTransform result=%{public}d", result);
auto rsNode11 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode11, "测试shadow");
uint32_t shadowColor = 0;
result = rsNode11->SetShadowColor(0x80000000);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetShadowColor result=%{public}d", result);
result = rsNode11->GetShadowColor(&shadowColor);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetShadowColor result=%{public}d, shadowColor=%{public}d", result,
shadowColor);
int32_t shadowOffsetX = 0;
int32_t shadowOffsetY = 0;
result = rsNode11->SetShadowOffset(15, 25);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetShadowOffset result=%{public}d", result);
result = rsNode11->GetShadowOffset(&shadowOffsetX, &shadowOffsetY);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetShadowOffset result=%{public}d, shadowOffsetX=%{public}d, "
"shadowOffsetY=%{public}d",
result, shadowOffsetX, shadowOffsetY);
float alpha = 0;
result = rsNode11->GetShadowAlpha(&alpha);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetShadowAlpha result=%{public}d, alpha=%{public}f", result, alpha);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetShadowAlpha result=%{public}d", result);
result = rsNode11->GetShadowAlpha(&alpha);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetShadowAlpha result=%{public}d, alpha=%{public}f", result, alpha);
float elevation = 0;
result = rsNode11->GetShadowElevation(&elevation);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetShadowElevation result=%{public}d, elevation=%{public}f", result,
elevation);
result = rsNode11->SetShadowElevation(0.5);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetShadowElevation result=%{public}d", result);
result = rsNode11->GetShadowElevation(&elevation);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetShadowElevation result=%{public}d, elevation=%{public}f", result,
elevation);
float radius = 0;
result = rsNode11->SetShadowRadius(15);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetShadowRadius result=%{public}d", result);
result = rsNode11->GetShadowRadius(&radius);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_GetShadowRadius result=%{public}d, clipTo=%{public}f", result, radius);
auto rsNode12 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode7, "测试pivot");
result = rsNode12->SetBorderStyle(
ArkUI_BorderStyle::ARKUI_BORDER_STYLE_SOLID, ArkUI_BorderStyle::ARKUI_BORDER_STYLE_SOLID,
ArkUI_BorderStyle::ARKUI_BORDER_STYLE_SOLID, ArkUI_BorderStyle::ARKUI_BORDER_STYLE_DOTTED);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetBorderStyle result=%{public}d", result);
result = rsNode12->SetBorderWidth(0, g_num20, g_num20, g_num20);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetBorderWidth result=%{public}d", result);
result = rsNode12->SetBorderColor(0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetBorderColor result=%{public}d", result);
result = rsNode12->SetBorderRadius(g_num20, g_num20, g_num20, g_num20);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetBorderStyle result=%{public}d", result);
auto rsNode13 = std::make_shared<ArkUIRenderNode>();
SetBaseProperty(column, rsNode13, "测试markNodeGroup");
rsNode13->SetOpacity(0.5);
auto rsNode14 = std::make_shared<ArkUIRenderNode>();
rsNode14->SetSize(g_num150, g_num150);
rsNode14->SetPosition(75, 75);
rsNode14->SetBackgroundColor(0xFFFFFFFF);
rsNode14->SetOpacity(1);
rsNode13->AddChild(rsNode14);
rsNode13->SetMarkNodeGroup(true);
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Manager",
"OH_ArkUI_RenderNodeUtils_SetDrawRegion result=%{public}d", result);
return scroll;
}
std::shared_ptr<ArkUIBaseNode> testRenderNodeCustom(ArkUI_NativeNodeAPI_1 *nodeAPI, ArkUI_ContextHandle context)
{
auto scroll = std::make_shared<ArkUIScrollNode>();
scroll->SetWidth(g_contentWidth);
scroll->SetHeight(g_contentHeight);
scroll->SetBackgroundColor(0xff00F100);
auto column = std::make_shared<ArkUIColumnNode>();
column->SetWidth(g_contentWidth);
column->SetHeight(g_contentHeight);
auto text = std::make_shared<ArkUITextNode>();
text->SetTextContent("RenderNode 自定义绘制示例");
text->SetWidth(g_num100);
text->SetHeight(g_num100);
auto Custom = std::make_shared<ArkUICustomNode>();
Custom->SetWidth(g_num100);
Custom->SetHeight(g_num100);
column->AddChild(text);
column->AddChild(Custom);
scroll->AddChild(column);
auto renderNode = std::make_shared<ArkUIRenderNode>();
Custom->AddRenderNode(renderNode);
renderNode->SetSize(g_num300, g_num300);
renderNode->SetBackgroundColor(0xFFFFFFFF);
renderNode->SetDrawRegion(0, 0, g_numBigSize, g_numBigSize);
renderNode->CreateContentModifier();
renderNode->CreateOrSetFloatAnimatableProperty(g_numBigSize);
renderNode->CreateOrSetVector2AnimatableProperty(g_numBigSize, g_numBigSize);
renderNode->CreateOrSetColorAnimatableProperty(0xFFFF11FF);
renderNode->SetContentModifierOnDraw(renderNode.get(), [](ArkUI_DrawContext *context, void *userData) {
ArkUIRenderNode *renderNode = (ArkUIRenderNode *)userData;
float width = 0;
float height = 0;
uint32_t color = 0;
int32_t NUM_3 = 3;
int32_t NUM_4 = 4;
renderNode->GetVector2AnimatableProperty(&width, &height);
renderNode->GetColorAnimatableProperty(&color);
auto *canvas1 = OH_ArkUI_DrawContext_GetCanvas(context);
OH_Drawing_Canvas *canvas = reinterpret_cast<OH_Drawing_Canvas *>(canvas1);
auto path = OH_Drawing_PathCreate();
OH_Drawing_PathMoveTo(path, width / NUM_4, height / NUM_4);
OH_Drawing_PathLineTo(path, width * NUM_3 / NUM_4, height / NUM_4);
OH_Drawing_PathLineTo(path, width * NUM_3 / NUM_4, height * NUM_3 / NUM_4);
OH_Drawing_PathLineTo(path, width / NUM_4, height * NUM_3 / NUM_4);
OH_Drawing_PathLineTo(path, width / NUM_4, height / NUM_4);
OH_Drawing_PathClose(path);
auto pen = OH_Drawing_PenCreate();
OH_Drawing_PenSetWidth(pen, 10);
OH_Drawing_PenSetColor(pen, color);
OH_Drawing_CanvasAttachPen(canvas, pen);
OH_Drawing_CanvasDrawPath(canvas, path);
OH_Drawing_CanvasDetachPen(canvas);
OH_Drawing_PenDestroy(pen);
OH_Drawing_PathDestroy(path);
});
auto *animationData = new RenderNodeAnimationData;
animationData->renderNode = renderNode;
ArkUI_ContextCallback *update = new ArkUI_ContextCallback;
update->userData = animationData;
update->callback = [](void *user) {
auto *data = reinterpret_cast<RenderNodeAnimationData *>(user);
if (data == nullptr) {
return;
}
auto renderNode = data->renderNode.lock();
if (renderNode == nullptr) {
return;
}
renderNode->CreateOrSetFloatAnimatableProperty(g_num100);
renderNode->CreateOrSetVector2AnimatableProperty(g_num100, g_num100);
renderNode->CreateOrSetColorAnimatableProperty(0xFF0011FF);
};
ArkUI_NativeAnimateAPI_1 *animateApi = nullptr;
OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_ANIMATE, ArkUI_NativeAnimateAPI_1, animateApi);
ArkUI_AnimateCompleteCallback *completeCallback = new ArkUI_AnimateCompleteCallback;
completeCallback->userData = animationData;
completeCallback->type = ARKUI_FINISH_CALLBACK_REMOVED;
completeCallback->callback = [](void *userData) {
auto *data = reinterpret_cast<RenderNodeAnimationData *>(userData);
if (data == nullptr) {
return;
}
auto renderNode = data->renderNode.lock();
if (renderNode != nullptr) {
renderNode->CreateOrSetFloatAnimatableProperty(g_numBigSize);
renderNode->CreateOrSetVector2AnimatableProperty(g_numBigSize, g_numBigSize);
renderNode->CreateOrSetColorAnimatableProperty(0xFF0011FF);
}
if (data->option != nullptr) {
OH_ArkUI_AnimateOption_Dispose(data->option);
}
delete data;
};
ArkUI_AnimateOption *option = OH_ArkUI_AnimateOption_Create();
animationData->option = option;
OH_ArkUI_AnimateOption_SetDuration(option, 2000);
OH_ArkUI_AnimateOption_SetCurve(option, ARKUI_CURVE_EASE);
OH_ArkUI_AnimateOption_SetIterations(option, 1);
OH_ArkUI_AnimateOption_SetPlayMode(option, ARKUI_ANIMATION_PLAY_MODE_REVERSE);
if (animateApi == nullptr ||
animateApi->animateTo(context, option, update, completeCallback) != ARKUI_ERROR_CODE_NO_ERROR) {
OH_ArkUI_AnimateOption_Dispose(option);
delete animationData;
delete update;
delete completeCallback;
}
return scroll;
}
napi_value CreateRenderNodeExample(napi_env env, napi_callback_info info)
{
size_t argc = 2;
napi_value args[2] = {nullptr, nullptr};
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
ArkUI_NodeContentHandle contentHandle;
int32_t result = OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &contentHandle);
if (result != ARKUI_ERROR_CODE_NO_ERROR) {
return nullptr;
}
if (!g_contextHandle) {
result = OH_ArkUI_GetContextFromNapiValue(env, args[1], &g_contextHandle);
if (result != ARKUI_ERROR_CODE_NO_ERROR) {
delete g_contextHandle;
g_contextHandle = nullptr;
return nullptr;
}
}
auto scrollNode = std::make_shared<ArkUIScrollNode>();
result = OH_ArkUI_NodeContent_AddNode(contentHandle, scrollNode->GetHandle());
if (result != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_ERROR(LOG_APP, "OH_ArkUI_NodeContent_AddNode Failed %{public}d", result);
return nullptr;
}
g_nodeMap[contentHandle] = scrollNode;
auto columnNode = CreateRenderNodeTreeExample(NativeModuleInstance::GetInstance()->GetNativeNodeAPI());
scrollNode->AddChild(columnNode);
return nullptr;
}
napi_value CreateRenderNodePropertyExample(napi_env env, napi_callback_info info)
{
size_t argc = 2;
napi_value args[2] = {nullptr, nullptr};
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
ArkUI_NodeContentHandle contentHandle;
int32_t result = OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &contentHandle);
if (result != ARKUI_ERROR_CODE_NO_ERROR) {
return nullptr;
}
if (!g_contextHandle) {
result = OH_ArkUI_GetContextFromNapiValue(env, args[1], &g_contextHandle);
if (result != ARKUI_ERROR_CODE_NO_ERROR) {
delete g_contextHandle;
g_contextHandle = nullptr;
return nullptr;
}
}
auto scrollNode = std::make_shared<ArkUIScrollNode>();
result = OH_ArkUI_NodeContent_AddNode(contentHandle, scrollNode->GetHandle());
if (result != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_ERROR(LOG_APP, "OH_ArkUI_NodeContent_AddNode Failed %{public}d", result);
return nullptr;
}
g_nodeMap[contentHandle] = scrollNode;
auto columnNode = testRenderNodeProperty(NativeModuleInstance::GetInstance()->GetNativeNodeAPI());
scrollNode->AddChild(columnNode);
return nullptr;
}
napi_value CreateRenderNodeCustomDrawExample(napi_env env, napi_callback_info info)
{
size_t argc = 2;
napi_value args[2] = {nullptr, nullptr};
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
ArkUI_NodeContentHandle contentHandle;
int32_t result = OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &contentHandle);
if (result != ARKUI_ERROR_CODE_NO_ERROR) {
return nullptr;
}
if (!g_contextHandle) {
result = OH_ArkUI_GetContextFromNapiValue(env, args[1], &g_contextHandle);
if (result != ARKUI_ERROR_CODE_NO_ERROR) {
delete g_contextHandle;
g_contextHandle = nullptr;
return nullptr;
}
}
auto scrollNode = std::make_shared<ArkUIScrollNode>();
result = OH_ArkUI_NodeContent_AddNode(contentHandle, scrollNode->GetHandle());
if (result != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_ERROR(LOG_APP, "OH_ArkUI_NodeContent_AddNode Failed %{public}d", result);
return nullptr;
}
g_nodeMap[contentHandle] = scrollNode;
auto columnNode = testRenderNodeCustom(NativeModuleInstance::GetInstance()->GetNativeNodeAPI(), g_contextHandle);
scrollNode->AddChild(columnNode);
return nullptr;
}
napi_value DisposeNodeTree(napi_env env, napi_callback_info info)
{
size_t argc = 1;
napi_value args[1] = {nullptr};
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
ArkUI_NodeContentHandle contentHandle;
int32_t result = OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &contentHandle);
if (result != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_ERROR(LOG_APP, "OH_ArkUI_GetNodeContentFromNapiValue Failed %{public}d", result);
return nullptr;
}
auto it = g_nodeMap.find(contentHandle);
if (it == g_nodeMap.end()) {
return nullptr;
}
auto rootNode = it->second;
result = OH_ArkUI_NodeContent_RemoveNode(contentHandle, rootNode->GetHandle());
if (result != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_ERROR(LOG_APP, "OH_ArkUI_NodeContent_RemoveNode Failed %{public}d", result);
return nullptr;
}
g_nodeMap.erase(contentHandle);
return nullptr;
}
napi_value DestroyNativeRoot(napi_env env, napi_callback_info info)
{
NativeEntry::GetInstance()->DisposeRootNode();
NativeEntry::GetInstance()->ClearNode();
return nullptr;
}
}