整理完创建节点和组件代码
This commit is contained in:
parent
e69e157960
commit
77dd6edf5f
@ -45,14 +45,13 @@ ArkUI_NodeHandle xc;
|
||||
int32_t NativeManager::hasDraw_ = 0;
|
||||
int32_t NativeManager::hasChangeColor_ = 0;
|
||||
|
||||
NativeManager::~NativeManager()
|
||||
{
|
||||
NativeManager::~NativeManager() {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Callback", "~NativeManager");
|
||||
nativeXComponentMap_.clear();
|
||||
if (eglcore_ != nullptr) {
|
||||
delete eglcore_;
|
||||
eglcore_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto iter = pluginManagerMap_.begin(); iter != pluginManagerMap_.end(); ++iter) {
|
||||
if (iter->second != nullptr) {
|
||||
@ -62,35 +61,29 @@ NativeManager::~NativeManager()
|
||||
}
|
||||
pluginManagerMap_.clear();
|
||||
}
|
||||
//Surface回调事件
|
||||
void OnSurfaceCreatedNative(OH_ArkUI_SurfaceHolder *holder)
|
||||
{
|
||||
// Surface回调事件
|
||||
void OnSurfaceCreatedNative(OH_ArkUI_SurfaceHolder *holder) {
|
||||
auto window = OH_ArkUI_XComponent_GetNativeWindow(holder); // 获取native window
|
||||
auto eglCore = reinterpret_cast<EGLCore*>(OH_ArkUI_SurfaceHolder_GetUserData(holder));
|
||||
auto eglCore = reinterpret_cast<EGLCore *>(OH_ArkUI_SurfaceHolder_GetUserData(holder));
|
||||
eglCore->EglContextInit(window, 800, 600);
|
||||
}
|
||||
void OnSurfaceChangedNative(OH_ArkUI_SurfaceHolder *holder, uint64_t width, uint64_t height)
|
||||
{
|
||||
EGLCore* render = reinterpret_cast<EGLCore*>(OH_ArkUI_SurfaceHolder_GetUserData(holder));
|
||||
render->UpdateSize(width, height); // 设置绘制区域大小
|
||||
render->Draw(NativeManager::hasDraw_); // 绘制五角星
|
||||
void OnSurfaceChangedNative(OH_ArkUI_SurfaceHolder *holder, uint64_t width, uint64_t height) {
|
||||
EGLCore *render = reinterpret_cast<EGLCore *>(OH_ArkUI_SurfaceHolder_GetUserData(holder));
|
||||
render->UpdateSize(width, height); // 设置绘制区域大小
|
||||
render->Draw(NativeManager::hasDraw_); // 绘制五角星
|
||||
}
|
||||
void OnSurfaceDestroyedNative(OH_ArkUI_SurfaceHolder *holder)
|
||||
{
|
||||
void OnSurfaceDestroyedNative(OH_ArkUI_SurfaceHolder *holder) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, 0xff00, "onBind", "on destroyed");
|
||||
EGLCore* render = reinterpret_cast<EGLCore*>(OH_ArkUI_SurfaceHolder_GetUserData(holder));
|
||||
render->Release(); // 销毁eglSurface相关资源
|
||||
EGLCore *render = reinterpret_cast<EGLCore *>(OH_ArkUI_SurfaceHolder_GetUserData(holder));
|
||||
render->Release(); // 销毁eglSurface相关资源
|
||||
}
|
||||
void OnSurfaceShowNative(OH_ArkUI_SurfaceHolder *holder)
|
||||
{
|
||||
void OnSurfaceShowNative(OH_ArkUI_SurfaceHolder *holder) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "on surface show");
|
||||
}
|
||||
void OnSurfaceHideNative(OH_ArkUI_SurfaceHolder *holder)
|
||||
{
|
||||
void OnSurfaceHideNative(OH_ArkUI_SurfaceHolder *holder) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "on surface hide");
|
||||
}
|
||||
void OnFrameCallbackNative(ArkUI_NodeHandle node, uint64_t timestamp, uint64_t targetTimestamp)
|
||||
{
|
||||
void OnFrameCallbackNative(ArkUI_NodeHandle node, uint64_t timestamp, uint64_t targetTimestamp) {
|
||||
if (!NativeManager::surfaceHolderMap_.count(node)) {
|
||||
return;
|
||||
}
|
||||
@ -101,53 +94,7 @@ void OnFrameCallbackNative(ArkUI_NodeHandle node, uint64_t timestamp, uint64_t t
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "OnFrameCallback count = %{public}ld", count);
|
||||
}
|
||||
}
|
||||
void onEvent(ArkUI_NodeEvent *event)
|
||||
{
|
||||
auto eventType = OH_ArkUI_NodeEvent_GetEventType(event); // 获取组件事件类型
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "on event");
|
||||
if (eventType == NODE_TOUCH_EVENT) {
|
||||
ArkUI_NodeHandle handle = OH_ArkUI_NodeEvent_GetNodeHandle(event); // 获取触发该事件的组件对象
|
||||
auto holder = NativeManager::surfaceHolderMap_[handle];
|
||||
EGLCore* render = reinterpret_cast<EGLCore*>(OH_ArkUI_SurfaceHolder_GetUserData(holder));
|
||||
render->Draw(NativeManager::hasDraw_); // 绘制五角星
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "on touch");
|
||||
}
|
||||
}
|
||||
static std::string value2String(napi_env env, napi_value value)
|
||||
{
|
||||
size_t stringSize = 0;
|
||||
napi_get_value_string_utf8(env, value, nullptr, 0, &stringSize);
|
||||
std::string valueString;
|
||||
valueString.resize(stringSize);
|
||||
napi_get_value_string_utf8(env, value, &valueString[0], stringSize+1, &stringSize);
|
||||
return valueString;
|
||||
}
|
||||
napi_value NativeManager::NapiDrawPattern(napi_env env, napi_callback_info info)
|
||||
{
|
||||
// [StartExclude plugin_draw_pattern]
|
||||
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "NativeManager", "NapiDrawPattern");
|
||||
if ((env == nullptr) || (info == nullptr)) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "NapiDrawPattern: env or info is null");
|
||||
return nullptr;
|
||||
}
|
||||
// [EndExclude plugin_draw_pattern]
|
||||
// 获取环境变量参数
|
||||
napi_value thisArg;
|
||||
if (napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, nullptr) != napi_ok) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "NapiDrawPattern: napi_get_cb_info fail");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto *pluginManger = NativeManager::GetInstance();
|
||||
// 调用绘制方法
|
||||
pluginManger->eglcore_->Draw(hasDraw_);
|
||||
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "NativeManager", "render->eglCore_->Draw() executed");
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
//XComponent回调事件
|
||||
void OnSurfaceCreatedCB(OH_NativeXComponent* component, void* window)
|
||||
{
|
||||
void OnSurfaceCreatedCB(OH_NativeXComponent *component, void *window) {
|
||||
// [StartExclude plugin_on_surface_created]
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "XComponent_Native", "OnSurfaceCreatedCB");
|
||||
int32_t ret;
|
||||
@ -157,7 +104,7 @@ void OnSurfaceCreatedCB(OH_NativeXComponent* component, void* window)
|
||||
if (ret != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
std::string id(idStr);
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "XComponent_Native", "OnSurfaceCreatedCB id=%{public}s",
|
||||
id.c_str());
|
||||
@ -166,8 +113,7 @@ void OnSurfaceCreatedCB(OH_NativeXComponent* component, void* window)
|
||||
auto *pluginManger = NativeManager::GetInstance();
|
||||
pluginManger->OnSurfaceCreated(component, window);
|
||||
}
|
||||
void OnSurfaceChangedCB(OH_NativeXComponent* component, void* window)
|
||||
{
|
||||
void OnSurfaceChangedCB(OH_NativeXComponent *component, void *window) {
|
||||
// [StartExclude plugin_on_surface_changed]
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "XComponent_Native", "OnSurfaceChangedCB");
|
||||
int32_t ret;
|
||||
@ -183,8 +129,7 @@ void OnSurfaceChangedCB(OH_NativeXComponent* component, void* window)
|
||||
// 封装OnSurfaceChanged方法
|
||||
pluginManger->OnSurfaceChanged(component, window);
|
||||
}
|
||||
void OnSurfaceDestroyedCB(OH_NativeXComponent* component, void* window)
|
||||
{
|
||||
void OnSurfaceDestroyedCB(OH_NativeXComponent *component, void *window) {
|
||||
// [StartExclude plugin_on_surface_destroyed]
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Callback", "OnSurfaceDestroyedCB");
|
||||
int32_t ret;
|
||||
@ -199,8 +144,7 @@ void OnSurfaceDestroyedCB(OH_NativeXComponent* component, void* window)
|
||||
auto *pluginManger = NativeManager::GetInstance();
|
||||
pluginManger->OnSurfaceDestroyed(component, window);
|
||||
}
|
||||
void DispatchTouchEventCB(OH_NativeXComponent* component, void* window)
|
||||
{
|
||||
void DispatchTouchEventCB(OH_NativeXComponent *component, void *window) {
|
||||
// [StartExclude plugin_dispatch_touch_event]
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Callback", "DispatchTouchEventCB");
|
||||
int32_t ret;
|
||||
@ -215,112 +159,9 @@ void DispatchTouchEventCB(OH_NativeXComponent* component, void* window)
|
||||
auto *pluginManger = NativeManager::GetInstance();
|
||||
pluginManger->DispatchTouchEvent(component, window);
|
||||
}
|
||||
NativeManager::NativeManager()
|
||||
{
|
||||
eglcore_ = new EGLCore();
|
||||
callback_.OnSurfaceCreated = OnSurfaceCreatedCB;
|
||||
callback_.OnSurfaceChanged = OnSurfaceChangedCB;
|
||||
callback_.OnSurfaceDestroyed = OnSurfaceDestroyedCB;
|
||||
callback_.DispatchTouchEvent = DispatchTouchEventCB;
|
||||
}
|
||||
ArkUI_NodeHandle CreateNodeHandle(const std::string &tag)
|
||||
{
|
||||
ArkUI_NodeHandle column = nodeAPI->createNode(ARKUI_NODE_RELATIVE_CONTAINER);
|
||||
ArkUI_NumberValue value[] = {480};
|
||||
ArkUI_NumberValue value1[] = {{.u32 = 15}, {.f32 = 15}};
|
||||
ArkUI_AttributeItem item = {value, 1, "changeSize"};
|
||||
ArkUI_AttributeItem item1 = {value1, 2};
|
||||
nodeAPI->setAttribute(column, NODE_WIDTH, &item);
|
||||
value[0].f32 = COLUMN_MARGIN;
|
||||
nodeAPI->setAttribute(column, NODE_MARGIN, &item);
|
||||
// 创建XComponent组件
|
||||
xc = nodeAPI->createNode(ARKUI_NODE_XCOMPONENT);
|
||||
// 设置XComponent组件属性
|
||||
value[0].u32 = ARKUI_XCOMPONENT_TYPE_SURFACE;
|
||||
nodeAPI->setAttribute(xc, NODE_XCOMPONENT_TYPE, &item);
|
||||
nodeAPI->setAttribute(xc, NODE_XCOMPONENT_ID, &item);
|
||||
nodeAPI->setAttribute(xc, NODE_XCOMPONENT_SURFACE_SIZE, &item1);
|
||||
ArkUI_NumberValue focusable[] = {1};
|
||||
focusable[0].i32 = 1;
|
||||
ArkUI_AttributeItem focusableItem = {focusable, 1};
|
||||
nodeAPI->setAttribute(xc, NODE_FOCUSABLE, &focusableItem);
|
||||
ArkUI_NumberValue valueSize[] = {480};
|
||||
ArkUI_AttributeItem itemSize = {valueSize, 1};
|
||||
valueSize[0].f32 = XC_WIDTH;
|
||||
nodeAPI->setAttribute(xc, NODE_WIDTH, &itemSize);
|
||||
valueSize[0].f32 = XC_HEIGHT;
|
||||
nodeAPI->setAttribute(xc, NODE_HEIGHT, &itemSize);
|
||||
ArkUI_AttributeItem item2 = {value, 1, "ndkxcomponent"};
|
||||
nodeAPI->setAttribute(xc, NODE_ID, &item2);
|
||||
|
||||
auto *nativeXComponent = OH_NativeXComponent_GetNativeXComponent(xc);
|
||||
if (!nativeXComponent) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "GetNativeXComponent error");
|
||||
return column;
|
||||
}
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "GetNativeXComponent success");
|
||||
// 注册XComponent回调函数
|
||||
OH_NativeXComponent_RegisterCallback(nativeXComponent, &NativeManager::callback_);
|
||||
auto typeRet = nodeAPI->getAttribute(xc, NODE_XCOMPONENT_TYPE);
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "xcomponent type: %{public}d",
|
||||
typeRet->value[0].i32);
|
||||
auto idRet = nodeAPI->getAttribute(xc, NODE_XCOMPONENT_ID);
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "xcomponent id: %{public}s",
|
||||
idRet->string);
|
||||
nodeAPI->addChild(column, xc);
|
||||
return column;
|
||||
}
|
||||
napi_value NativeManager::createNativeNode(napi_env env, napi_callback_info info)
|
||||
{
|
||||
if ((env == nullptr) || (info == nullptr)) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "CreateNativeNode env or info is null");
|
||||
return nullptr;
|
||||
}
|
||||
size_t argCnt = 2;
|
||||
napi_value args[2] = { nullptr, nullptr };
|
||||
if (napi_get_cb_info(env, info, &argCnt, args, nullptr, nullptr) != napi_ok) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "CreateNativeNode napi_get_cb_info failed");
|
||||
}
|
||||
if (argCnt != ARG_CNT) {
|
||||
napi_throw_type_error(env, NULL, "Wrong number of arguments");
|
||||
return nullptr;
|
||||
}
|
||||
ArkUI_NodeContentHandle nodeContentHandle_ = nullptr;
|
||||
OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &nodeContentHandle_);
|
||||
nodeAPI = reinterpret_cast<ArkUI_NativeNodeAPI_1*>(
|
||||
OH_ArkUI_QueryModuleInterfaceByName(ARKUI_NATIVE_NODE, "ArkUI_NativeNodeAPI_1")
|
||||
);
|
||||
std::string tag = value2String(env, args[1]);
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "tag=%{public}s", tag.c_str());
|
||||
int32_t ret = OH_ArkUI_NodeContent_SetUserData(nodeContentHandle_, new std::string(tag));
|
||||
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "setUserData failed error=%{public}d", ret);
|
||||
}
|
||||
if (nodeAPI != nullptr && nodeAPI->createNode != nullptr && nodeAPI->addChild != nullptr) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager",
|
||||
"CreateNativeNode tag=%{public}s", tag.c_str());
|
||||
auto nodeContentEvent = [](ArkUI_NodeContentEvent *event) {
|
||||
ArkUI_NodeContentHandle handle = OH_ArkUI_NodeContentEvent_GetNodeContentHandle(event);
|
||||
std::string *userDate = reinterpret_cast<std::string*>(OH_ArkUI_NodeContent_GetUserData(handle));
|
||||
if (OH_ArkUI_NodeContentEvent_GetEventType(event) == NODE_CONTENT_EVENT_ON_ATTACH_TO_WINDOW) {
|
||||
ArkUI_NodeHandle testNode;
|
||||
if (userDate) {
|
||||
testNode = CreateNodeHandle(*userDate);
|
||||
delete userDate;
|
||||
userDate = nullptr;
|
||||
} else {
|
||||
testNode = CreateNodeHandle("noUserData");
|
||||
}
|
||||
OH_ArkUI_NodeContent_AddNode(handle, testNode);
|
||||
}
|
||||
};
|
||||
OH_ArkUI_NodeContent_RegisterCallback(nodeContentHandle_, nodeContentEvent);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
void NativeManager::OnSurfaceCreated(OH_NativeXComponent* component, void* window)
|
||||
{
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "XComponent_Native", "NativeManager::OnSurfaceCreated");
|
||||
//NativeManager回调
|
||||
void NativeManager::OnSurfaceCreated(OH_NativeXComponent *component, void *window) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "XComponent_Native", "PluginManager::OnSurfaceCreated");
|
||||
int32_t ret;
|
||||
char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {};
|
||||
uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1;
|
||||
@ -331,12 +172,10 @@ void NativeManager::OnSurfaceCreated(OH_NativeXComponent* component, void* windo
|
||||
eglcore_->Background();
|
||||
}
|
||||
}
|
||||
void NativeManager::OnSurfaceDestroyed(OH_NativeXComponent* component, void* window)
|
||||
{
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "XComponent_Native", "NativeManager::OnSurfaceDestroyed");
|
||||
void NativeManager::OnSurfaceDestroyed(OH_NativeXComponent *component, void *window) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "XComponent_Native", "PluginManager::OnSurfaceDestroyed");
|
||||
}
|
||||
void NativeManager::DispatchTouchEvent(OH_NativeXComponent* component, void* window)
|
||||
{
|
||||
void NativeManager::DispatchTouchEvent(OH_NativeXComponent *component, void *window) {
|
||||
int32_t ret = OH_NativeXComponent_GetTouchEvent(component, window, &touchEvent_);
|
||||
if (ret == OH_NATIVEXCOMPONENT_RESULT_SUCCESS) {
|
||||
float tiltX = 2.2;
|
||||
@ -349,8 +188,8 @@ void NativeManager::DispatchTouchEvent(OH_NativeXComponent* component, void* win
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "XComponent_Native",
|
||||
"Touch Info : x=%{public}f, y=%{public}f screenx=%{public}f, screeny=%{public}f,"
|
||||
"type=%{public}d, force=%{public}f, tiltX=%{public}f, tiltY=%{public}f, toolType=%{public}d",
|
||||
touchEvent_.x, touchEvent_.y, touchEvent_.screenX,
|
||||
touchEvent_.screenY, touchEvent_.type, touchEvent_.force, tiltX, tiltY, toolType);
|
||||
touchEvent_.x, touchEvent_.y, touchEvent_.screenX, touchEvent_.screenY, touchEvent_.type,
|
||||
touchEvent_.force, tiltX, tiltY, toolType);
|
||||
if (touchEvent_.type == OH_NativeXComponent_TouchEventType::OH_NATIVEXCOMPONENT_UP) {
|
||||
eglcore_->ChangeColor(hasChangeColor_);
|
||||
}
|
||||
@ -374,14 +213,177 @@ void NativeManager::DispatchTouchEvent(OH_NativeXComponent* component, void* win
|
||||
}
|
||||
}
|
||||
}
|
||||
void NativeManager::OnSurfaceChanged(OH_NativeXComponent* component, void* window)
|
||||
{
|
||||
void NativeManager::OnSurfaceChanged(OH_NativeXComponent *component, void *window) {
|
||||
int32_t ret = OH_NativeXComponent_GetXComponentSize(component, window, &width_, &height_);
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "XComponent_Native",
|
||||
"OnSurfaceChanged ret=%{public}d width=%{public}lu, height=%{public}lu", ret, width_, height_);
|
||||
}
|
||||
napi_value NativeManager::SetFrameRate(napi_env env, napi_callback_info info)
|
||||
{
|
||||
void onEvent(ArkUI_NodeEvent *event) {
|
||||
auto eventType = OH_ArkUI_NodeEvent_GetEventType(event); // 获取组件事件类型
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "on event");
|
||||
if (eventType == NODE_TOUCH_EVENT) {
|
||||
ArkUI_NodeHandle handle = OH_ArkUI_NodeEvent_GetNodeHandle(event); // 获取触发该事件的组件对象
|
||||
auto holder = NativeManager::surfaceHolderMap_[handle];
|
||||
EGLCore *render = reinterpret_cast<EGLCore *>(OH_ArkUI_SurfaceHolder_GetUserData(holder));
|
||||
render->Draw(NativeManager::hasDraw_); // 绘制五角星
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "on touch");
|
||||
}
|
||||
}
|
||||
static std::string value2String(napi_env env, napi_value value) {
|
||||
size_t stringSize = 0;
|
||||
napi_get_value_string_utf8(env, value, nullptr, 0, &stringSize);
|
||||
std::string valueString;
|
||||
valueString.resize(stringSize);
|
||||
napi_get_value_string_utf8(env, value, &valueString[0], stringSize + 1, &stringSize);
|
||||
return valueString;
|
||||
}
|
||||
napi_value NativeManager::NapiDrawPattern(napi_env env, napi_callback_info info) {
|
||||
// [StartExclude plugin_draw_pattern]
|
||||
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "NativeManager", "NapiDrawPattern");
|
||||
if ((env == nullptr) || (info == nullptr)) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "NapiDrawPattern: env or info is null");
|
||||
return nullptr;
|
||||
}
|
||||
// [EndExclude plugin_draw_pattern]
|
||||
// 获取环境变量参数
|
||||
napi_value thisArg;
|
||||
if (napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, nullptr) != napi_ok) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "NapiDrawPattern: napi_get_cb_info fail");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto *pluginManger = NativeManager::GetInstance();
|
||||
// 调用绘制方法
|
||||
pluginManger->eglcore_->Draw(hasDraw_);
|
||||
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "NativeManager", "render->eglCore_->Draw() executed");
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
// XComponent回调事件
|
||||
NativeManager::NativeManager() {
|
||||
eglcore_ = new EGLCore();
|
||||
callback_.OnSurfaceCreated = OnSurfaceCreatedCB;
|
||||
callback_.OnSurfaceChanged = OnSurfaceChangedCB;
|
||||
callback_.OnSurfaceDestroyed = OnSurfaceDestroyedCB;
|
||||
callback_.DispatchTouchEvent = DispatchTouchEventCB;
|
||||
}
|
||||
// 创建节点组件
|
||||
ArkUI_NodeHandle CreateNodeHandle(const std::string &tag) {
|
||||
// 创建Node也名创建ROW Column等容器
|
||||
ArkUI_NodeHandle nodeHandel = nodeAPI->createNode(ARKUI_NODE_RELATIVE_CONTAINER);
|
||||
// 节点默认宽度or高度
|
||||
ArkUI_NumberValue nodeSizeData[] = {800, 600};
|
||||
ArkUI_NumberValue nodeMarginData[] = {{.u32 = 15}, {.f32 = 15}};
|
||||
// ArkUI_AttributeItem
|
||||
// 参数1:指向数值数组
|
||||
// 参数2:数组元素个数
|
||||
// 参数3:属性名(可隐藏)
|
||||
ArkUI_AttributeItem nodeSizeItem = {nodeSizeData, 2};
|
||||
ArkUI_AttributeItem nodeMarginItem = {nodeMarginData, 2};
|
||||
// 设置Node宽度or高度
|
||||
nodeAPI->setAttribute(nodeHandel, NODE_SIZE, &nodeSizeItem);
|
||||
nodeAPI->setAttribute(nodeHandel, NODE_MARGIN, &nodeMarginItem);
|
||||
// 创建XComponent组件
|
||||
// 组件类型Item
|
||||
ArkUI_NumberValue comTypeData[] = {ARKUI_XCOMPONENT_TYPE_SURFACE};
|
||||
ArkUI_AttributeItem comTypeItem = {comTypeData, 1};
|
||||
// 组件ID Item
|
||||
ArkUI_AttributeItem comIdItem = {.string = tag.c_str(), .size = 1};
|
||||
// 组件Surface Size
|
||||
ArkUI_NumberValue surfaceSizeData[] = {800, 600};
|
||||
ArkUI_AttributeItem surfaceSizeItem = {surfaceSizeData, 2};
|
||||
// 创建组件
|
||||
xc = nodeAPI->createNode(ARKUI_NODE_XCOMPONENT);
|
||||
// 设置XComponent组件属性
|
||||
nodeAPI->setAttribute(xc, NODE_XCOMPONENT_TYPE, &comTypeItem);
|
||||
nodeAPI->setAttribute(xc, NODE_XCOMPONENT_ID, &comIdItem);
|
||||
nodeAPI->setAttribute(xc, NODE_XCOMPONENT_SURFACE_SIZE, &surfaceSizeItem);
|
||||
// 焦点设置
|
||||
ArkUI_NumberValue focusable[] = {1};
|
||||
focusable[0].i32 = 1;
|
||||
ArkUI_AttributeItem focusableItem = {focusable, 1};
|
||||
nodeAPI->setAttribute(xc, NODE_FOCUSABLE, &focusableItem);
|
||||
// 设置组件Size
|
||||
nodeAPI->setAttribute(xc, NODE_WIDTH, &surfaceSizeItem);
|
||||
nodeAPI->setAttribute(xc, NODE_HEIGHT, &surfaceSizeItem);
|
||||
// 节点ID
|
||||
ArkUI_AttributeItem nodeIdItem = {.string = "ndkxcomponent", .size = 1};
|
||||
nodeAPI->setAttribute(xc, NODE_ID, &nodeIdItem);
|
||||
|
||||
auto *nativeXComponent = OH_NativeXComponent_GetNativeXComponent(xc);
|
||||
if (!nativeXComponent) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "GetNativeXComponent error");
|
||||
return nodeHandel;
|
||||
}
|
||||
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "NativeManager", "GetNativeXComponent success");
|
||||
// 注册XComponent回调函数
|
||||
|
||||
OH_NativeXComponent_RegisterCallback(nativeXComponent, &NativeManager::callback_);
|
||||
// 组件类型
|
||||
auto comTypeRet = nodeAPI->getAttribute(xc, NODE_XCOMPONENT_TYPE);
|
||||
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "NativeManager", "com type: %{public}d",
|
||||
comTypeRet->value[0].i32);
|
||||
// 组件ID
|
||||
auto comIdRet = nodeAPI->getAttribute(xc, NODE_XCOMPONENT_ID);
|
||||
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "NativeManager", "com id: %{public}s", comIdRet->string);
|
||||
// 增加组件到节点
|
||||
nodeAPI->addChild(nodeHandel, xc);
|
||||
return nodeHandel;
|
||||
}
|
||||
// Native侧创建Node
|
||||
napi_value NativeManager::createNativeNode(napi_env env, napi_callback_info info) {
|
||||
if ((env == nullptr) || (info == nullptr)) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "CreateNativeNode env or info is null");
|
||||
return nullptr;
|
||||
}
|
||||
size_t argCnt = 2;
|
||||
napi_value args[2] = {nullptr, nullptr};
|
||||
if (napi_get_cb_info(env, info, &argCnt, args, nullptr, nullptr) != napi_ok) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "CreateNativeNode napi_get_cb_info failed");
|
||||
}
|
||||
if (argCnt != ARG_CNT) {
|
||||
napi_throw_type_error(env, NULL, "Wrong number of arguments");
|
||||
return nullptr;
|
||||
}
|
||||
ArkUI_NodeContentHandle _nodeContentHandle = nullptr;
|
||||
// 获取ArkTS侧创建的NodeContent对象,映射到Native侧的
|
||||
OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &_nodeContentHandle);
|
||||
// 查询指定的模块接口名
|
||||
nodeAPI = reinterpret_cast<ArkUI_NativeNodeAPI_1 *>(
|
||||
OH_ArkUI_QueryModuleInterfaceByName(ARKUI_NATIVE_NODE, "ArkUI_NativeNodeAPI_1"));
|
||||
// 节点名
|
||||
std::string node_id = value2String(env, args[1]);
|
||||
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "NativeManager", "CreateNativeNode_Node_ID:", node_id.c_str());
|
||||
// 设置用户自定义数据
|
||||
int32_t ret = OH_ArkUI_NodeContent_SetUserData(_nodeContentHandle, new std::string(node_id));
|
||||
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
|
||||
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "NativeManager", "setUserData failed error=%{public}d", ret);
|
||||
}
|
||||
if (nodeAPI != nullptr && nodeAPI->createNode != nullptr && nodeAPI->addChild != nullptr) {
|
||||
auto nodeContentEvent = [](ArkUI_NodeContentEvent *event) {
|
||||
// 获取Node连接事件的对应Node的Handle
|
||||
ArkUI_NodeContentHandle handle = OH_ArkUI_NodeContentEvent_GetNodeContentHandle(event);
|
||||
// 获取对应Handle的UserData
|
||||
std::string *userDate = reinterpret_cast<std::string *>(OH_ArkUI_NodeContent_GetUserData(handle));
|
||||
if (OH_ArkUI_NodeContentEvent_GetEventType(event) == NODE_CONTENT_EVENT_ON_ATTACH_TO_WINDOW) {
|
||||
ArkUI_NodeHandle testNode;
|
||||
if (userDate) {
|
||||
testNode = CreateNodeHandle(*userDate);
|
||||
delete userDate;
|
||||
userDate = nullptr;
|
||||
} else {
|
||||
testNode = CreateNodeHandle("noUserData");
|
||||
}
|
||||
// 向NodeContent中添加子组件
|
||||
OH_ArkUI_NodeContent_AddNode(handle, testNode);
|
||||
}
|
||||
};
|
||||
OH_ArkUI_NodeContent_RegisterCallback(_nodeContentHandle, nodeContentEvent);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
//设置期望帧率
|
||||
napi_value NativeManager::SetFrameRate(napi_env env, napi_callback_info info) {
|
||||
size_t argc = 4;
|
||||
napi_value args[4] = {nullptr};
|
||||
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
||||
@ -400,8 +402,7 @@ napi_value NativeManager::SetFrameRate(napi_env env, napi_callback_info info)
|
||||
OH_ArkUI_XComponent_SetExpectedFrameRateRange(node, range); // 设置期望帧率
|
||||
return nullptr;
|
||||
}
|
||||
napi_value NativeManager::SetNeedSoftKeyboard(napi_env env, napi_callback_info info)
|
||||
{
|
||||
napi_value NativeManager::SetNeedSoftKeyboard(napi_env env, napi_callback_info info) {
|
||||
size_t argc = 2;
|
||||
napi_value args[2] = {nullptr};
|
||||
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
||||
@ -419,4 +420,4 @@ napi_value NativeManager::SetNeedSoftKeyboard(napi_env env, napi_callback_info i
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace NativeXComponentSample
|
||||
} // namespace NativeOpenCAX
|
||||
|
||||
@ -26,20 +26,18 @@
|
||||
#include "arkui/native_node.h"
|
||||
#include "arkui/native_node_napi.h"
|
||||
|
||||
// [Start plugin_manager_h_part]
|
||||
// plugin_manager.h
|
||||
|
||||
namespace NativeOpenCAX {
|
||||
// [StartExclude plugin_manager_h_part]
|
||||
|
||||
constexpr const int FIRST_ARG = 1;
|
||||
constexpr const int SECOND_ARG = 2;
|
||||
constexpr const int THIRD_ARG = 3;
|
||||
constexpr const int FRAME_COUNT = 50;
|
||||
// [Start plugin_manager_h]
|
||||
// 在头文件中定义NativeManager类
|
||||
// [EndExclude plugin_manager_h_part]
|
||||
|
||||
|
||||
class NativeManager {
|
||||
public:
|
||||
// [StartExclude plugin_manager_h_part]
|
||||
|
||||
static OH_NativeXComponent_Callback callback_;
|
||||
NativeManager();
|
||||
~NativeManager();
|
||||
|
||||
@ -26,6 +26,12 @@ namespace NativeOpenCAX {
|
||||
/**
|
||||
* Log print domain.
|
||||
*/
|
||||
#define DOMAIN 0xD001000
|
||||
|
||||
//#define LOGD(fmt, ...) HILOG_DEBUG(DOMAIN, TAG, fmt, ##__VA_ARGS__)
|
||||
//#define LOGI(fmt, ...) HILOG_INFO(DOMAIN, TAG, fmt, ##__VA_ARGS__)
|
||||
//#define LOGW(fmt, ...) HILOG_WARN(DOMAIN, TAG, fmt, ##__VA_ARGS__)
|
||||
//#define LOGE(fmt, ...) HILOG_ERROR(DOMAIN, TAG, fmt, ##__VA_ARGS__)
|
||||
const unsigned int LOG_PRINT_DOMAIN = 0xFF00;
|
||||
} // namespace NativeXComponentSample
|
||||
#endif // NATIVE_XCOMPONENT_COMMON_H
|
||||
|
||||
Loading…
Reference in New Issue
Block a user