鸿蒙NEXT系列之精析NDK UI API(节点增删和属性设置) - 实践

news/2025/11/11 18:07:55/文章来源:https://www.cnblogs.com/tlnshuju/p/19211223

鸿蒙NEXT系列之精析NDK UI API(节点增删和属性设置) - 实践

2025-11-11 18:04  tlnshuju  阅读(0)  评论(0)    收藏  举报

精析NDK UI API(节点增删和属性设置)

  • 〇、前言
  • 一、UI 节点的增删
    • 1、挂载节点
    • 2、OH_ArkUI_NodeContent_AddNode
    • 3、移除节点
  • 二、节点属性的设置
    • 1、ArkUI_NodeAttributeType
    • 2、ArkUI_AttributeItem

〇、前言

上一篇,重点是案例的完整实现,使代码达到能够在所部署的真机上顺利运行,而对其中用到的几个比较重要的 NDK UI API 并没有仔细分析和学习,本着知其然也知其所以然的精神,本篇将就 H_ArkUI_NodeContent_AddNodeOH_ArkUI_NodeContent_RemoveNodesetAttribute 进行仔细的剖析,从而彻底认识和掌握。

一、UI 节点的增删

在使用 ArkTS 代码实现应用UI时,并不需要对 UI 树上的节点进行管理,一切交给 ArkTS 编译器自行处理,然而,到了 C++ 代码这边,却需要手动进行节点的挂载和移除,这一点,本人认为跟C++ UI 组件是通过 ContentSlot 去载入到 ArkTS Pages 的方式有关;具体什么缘故,暂且不论,因为目前也没有更底层的鸿蒙系统API源码可以跟踪,所以还是将目光放到C++代码中,如何手动管理节点的挂载和移除。

1、挂载节点

调用 NDK UI 组件也即由C++代码实现的UI组件时,需要将该组件对应的根节点(相当于用@Compoment装饰的 ArkTS 结构体)挂载到UI树上,从而才能在应用视图中渲染;这一步,在上一篇的案例代码中,就是 NativeEntry 类的 setRootNode 方法:

void SetRootNode(const std::shared_ptr<NativeModule::ArkUIBaseNode> &root) {root_ = root;// 添加 Native 组件到 NodeContent 上用于挂载显示OH_ArkUI_NodeContent_AddNode(handle_, root_->GetHandle());}

该方法体的实现,也就两行代码,第一行代码就是将参数传进来的指针,赋值给私有变量进行持有,与所谓的挂载UI节点没有一毛钱关系,与此密切相关的也只能是剩下的一行代码,而 OH_ArkUI_NodeContent_AddNode 也真就是 NDK 提供的管理 UI 节点的 API。

2、OH_ArkUI_NodeContent_AddNode

该 API 原型如下:
在这里插入图片描述
方法的调用,必须传入两个规定类型的参数,对于第一个参数、也即 ArkUI_NodeContentHandle 对象实例,顺着案例的代码调用链,会在 NativeListPage.ets 里面看到实际传入的,就是 NodeContent 对象:
在这里插入图片描述
而 NodeContent:
在这里插入图片描述
而第二个参数,在案例代码里面,就是在 CreateTextListExample 方法中用 std::make_shared 包装创建的 ArkUIListNode 对象。
对于 std::make_shared,是 NDK 提供的标准库中用于创建动态对象的智能指针工具,从而保障指针安全;至于 ArkUIListNode 就是我们自己用 C++ 代码定义和实现的、代表列表组件的节点对象:
在这里插入图片描述
节点的具体创建,是通过调用 NDK API createNode 去完成的,而 createNode 功能主要就是根据参数类型创建相应的鸿蒙UI组件:
在这里插入图片描述
而 ArkUI_NodeType 现有如下:

/**
* @brief Enumerates ArkUI component types that can be created on the native side.
*
* @since 12
*/
typedef enum {
/** Custom node. */
ARKUI_NODE_CUSTOM = 0,
/** Text. */
ARKUI_NODE_TEXT = 1,
/** Text span. */
ARKUI_NODE_SPAN = 2,
/** Image span. */
ARKUI_NODE_IMAGE_SPAN = 3,
/** Image. */
ARKUI_NODE_IMAGE = 4,
/** Toggle. */
ARKUI_NODE_TOGGLE = 5,
/** Loading icon. */
ARKUI_NODE_LOADING_PROGRESS = 6,
/** Single-line text input. */
ARKUI_NODE_TEXT_INPUT = 7,
/** Multi-line text input. */
ARKUI_NODE_TEXT_AREA = 8,
/** Button. */
ARKUI_NODE_BUTTON = 9,
/** Progress indicator. */
ARKUI_NODE_PROGRESS = 10,
/** Check box. */
ARKUI_NODE_CHECKBOX = 11,
/** XComponent. */
ARKUI_NODE_XCOMPONENT = 12,
/** Date picker. */
ARKUI_NODE_DATE_PICKER = 13,
/** Time picker. */
ARKUI_NODE_TIME_PICKER = 14,
/** Text picker. */
ARKUI_NODE_TEXT_PICKER = 15,
/** Calendar picker. */
ARKUI_NODE_CALENDAR_PICKER = 16,
/** Slider. */
ARKUI_NODE_SLIDER = 17,
/** Radio */
ARKUI_NODE_RADIO = 18,
/** Image animator. */
ARKUI_NODE_IMAGE_ANIMATOR = 19,
/** XComponent of type TEXTURE.
*  @since 18
*/
ARKUI_NODE_XCOMPONENT_TEXTURE,
/** Check box group.
*  @since 15
*/
ARKUI_NODE_CHECKBOX_GROUP = 21,
/** Stack container. */
ARKUI_NODE_STACK = MAX_NODE_SCOPE_NUM,
/** Swiper. */
ARKUI_NODE_SWIPER,
/** Scrolling container. */
ARKUI_NODE_SCROLL,
/** List. */
ARKUI_NODE_LIST,
/** List item. */
ARKUI_NODE_LIST_ITEM,
/** List item group. */
ARKUI_NODE_LIST_ITEM_GROUP,
/** Column container. */
ARKUI_NODE_COLUMN,
/** Row container. */
ARKUI_NODE_ROW,
/** Flex container. */
ARKUI_NODE_FLEX,
/** Refresh component. */
ARKUI_NODE_REFRESH,
/** Water flow container. */
ARKUI_NODE_WATER_FLOW,
/** Water flow item. */
ARKUI_NODE_FLOW_ITEM,
/** Relative layout component. */
ARKUI_NODE_RELATIVE_CONTAINER,
/** Grid. */
ARKUI_NODE_GRID,
/** Grid item. */
ARKUI_NODE_GRID_ITEM,
/** Custom span. */
ARKUI_NODE_CUSTOM_SPAN,
/**
* EmbeddedComponent.
* @since 20
*/
ARKUI_NODE_EMBEDDED_COMPONENT,
/**
* Undefined.
* @since 20
*/
ARKUI_NODE_UNDEFINED,
} ArkUI_NodeType;

因此,在C++代码中要创建一个具体的鸿蒙UI组件类型的节点,只需按着ArkUI_NodeType这个图去索骥即可。

3、移除节点

移除节点,在上一篇的案例代码中,是在 NativeEntry 类的 DisposeRootNode 方法中,调用 NDK API OH_ArkUI_NodeContent_RemoveNode 去完成的,该API方法原型如下:
在这里插入图片描述
是与 OH_ArkUI_NodeContent_AddNode() 相互配合使用的,参数结构也与 OH_ArkUI_NodeContent_AddNode() 如出一辙,所以,可以直接参考前面的内容去认识和掌握它即可。

二、节点属性的设置

如果屏幕前的你已经仔细阅读上一篇的案例代码,不难发现,无论是 ArkUINode,还是 ArkUIListNode 和 ArkUIListItemNode,亦或是 ArkUITextNode,设置节点属性的实现代码是用同一个模子刻出来的
在这里插入图片描述
大家都关键地用到了 setAttribute 这个 NDK API:
在这里插入图片描述

1、ArkUI_NodeAttributeType

ArkUI_NodeAttributeType 定义的字段比较多,具体的可以到这里进行浏览。

这些属性,分为组件公共属性,也就是类似 NODE_WIDTH 这种名称不带具体组件称呼的;以及组件私有属性,如 NODE_LIST_ALIGN_LIST_ITEM 带着具体组件名称的。

ArkUI_NodeAttributeType 就是用来告诉 setAttribute 方法,参数一具体是什么类型的组件、以及即将要对该类型组件的哪个属性进行设置

2、ArkUI_AttributeItem

setAttribute 方法的第三个参数,是一个 ArkUI_AttributeItem 类型的常指针。

ArkUI_AttributeItem 的原型如下:

**
* @brief Defines the general input parameter structure of the {@link setAttribute} function.
*
* @since 12
*/
typedef struct {
/** Numeric array. */
const ArkUI_NumberValue* value;
/** Size of the numeric array. */
int32_t size;
/** String type. */
const char* string;
/** Object type. */
void* object;
} ArkUI_AttributeItem;

也只有看了这个ArkUI_AttributeItem原型,才会明白 ArkUI_NumberValue value[] = {{.i32 = align}};ArkUI_AttributeItem item = {value, 1}; 这两行代码的具体意义。

ArkUI_NumberValue 实际上也是一个结构体:

/**
* @brief Provides the number types of ArkUI in the native code.
*
* @since 12
*/
typedef union {
/** Floating-point type. */
float f32;
/** Signed integer. */
int32_t i32;
/** Unsigned integer. */
uint32_t u32;
} ArkUI_NumberValue;

表示数字类型,具体的值对应什么类型,就给对应的字段进行赋值,所以 ArkUI_NumberValue value[] = {{.i32 = align}} 就是设置一个 int32_t 类型的数字值。

通常,如果设置节点属性所用的数据值是数字类型的,那么只需对 ArkUI_AttributeItem 的前两个字段进行赋值;而如果是字符串类型的,那么就需要用类似 ArkUI_AttributeItem item = {nullptr, 0, content.c_str()} 代码,将最后两个字段也进行赋值,并且代表数字的前两个字段要分别设置为 nullptr 和 0——表示空值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通用cursor rules总结

所有项目通用规则 命名:base.mdc点击查看代码 --- description: globs: alwaysApply: true --- # 核心开发原则## 通用开发原则 - **可测试性**:编写可测试的代码,组件应保持单一职责 - **DRY 原则**:避免重复代码…

【JVS更新日志】开源框架升级vue 3、低代码、企业计划、智能BI及其他产品迎来新版本! - 实践

【JVS更新日志】开源框架升级vue 3、低代码、企业计划、智能BI及其他产品迎来新版本! - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impo…

银川西林瓶灌装旋盖机推荐2025,运行稳定连续8小时无故障

在制药、诊断试剂及高端保健品等细分领域,西林瓶灌装设备的运行稳定性已成为用户采购决策中的核心考量因素。据2024年行业调研数据显示,在连续工作8小时以上的生产场景中,设备无故障率对产线效率的影响权重高达67%。…

【ACM出版 | EI检索稳定】2025年人工智能、业务转型和数据科学创新国际学术会议(ICBTDS 2025)

人工智能(AI)正以前所未有的速度重塑全球商业格局,推动各行业业务模式转型和数据科学创新。【人工智能、大数据、机器学习、管理、经济相关主题稿件均可接收】 【稿件投稿录用可免费参会作口头报告】 2025年人工智能…

echarts 树形结构图实例

<html> <head><meta charset="UTF-8"> <title>用户关系图</title><style> </style><script type="text/javascript" src="https://fastly.jsd…

pg_hba.conf配置里peer,indent和md5的区别

在 PostgreSQL 的 pg_hba.conf配置文件中,peer、ident和 md5是三种不同的认证方法。以下是它们的详细区别: 1. peer​ 认证方法 特点: 仅适用于本地连接(local connection type) 基于操作系统用户身份进行认证 不…

基于Simulink的双电机PID控制仿真实现方案

基于Simulink的双电机PID控制仿真实现方案,包含S函数建模、阶跃信号输入和可视化分析:一、系统架构设计二、模块实现 1. 电机动力学S函数(motor_sfun.m) function [sys,x0,str,ts] = motor_sfun(t,x,u,flag) switc…

锡林郭勒西林瓶灌装清洗耗材月成本分析?查行情享优惠

近年来,随着制药装备智能化水平持续提升,西林瓶灌装设备及相关配套耗材的采购成本正逐步趋于理性。行业普遍呈现出“高配置、低门槛”的价格趋势,性价比已成为用户选购西林瓶灌装生产线的核心考量指标。尤其在清洗环…

AI Agent OS 探索有价值的论文分析(1):Sleep-time Compute

Sleep-time Compute 分析 1.摘要 论文信息论文地址:[2504.13171v1] Sleep-time Compute: Beyond Inference Scaling at Test-time开源项目:GitHub - letta-ai/sleep-time-compute: accompanying material for sleep-…

Linux内核架构浅谈26-Linux实时进程调度:优先级反转与解决实用的方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

宏定义的高级应用

define KEY3_PORT GPIOE define KEY3_PIN GPIO_Pin_1 define KEY3_EXTI_PORTSOURCE EXTI_PortSourceGPIOE define KEY3_EXTI_PINSOURCE EXTI_PinSource1 define KEY3_EXTI_Line EXTI_Line1 define KEY4_PORT …

被问性能后,我封装了这个 PHP 错误上报工具

介绍 PHP 日志库 hejunjie/lazylog 的实现:用 proc_open / exec 伪异步上报异常,支持本地日志与常驻内存框架优化,轻量高效,适合生产环境使用最近我把自己常用的一套错误上报逻辑封装成了一个 Composer 包,叫 ​h…

公众号中的贴纸素材有什么作用?在哪里找?

不知道你有没有这种感觉:公众号文章写好了,排版也收拾得挺干净,但总觉得页面有点“素”,少了点能抓住眼球的小趣味。 这时候,贴纸素材就派上用场了。 你可能已经用过一些贴纸,比如在段落之间加一条可爱的分割线,…

国标GB28181算法算力平台EasyGBS:深度解析全场景视频调阅功能与行业实战应用

国标GB28181算法算力平台EasyGBS:深度解析全场景视频调阅功能与行业实战应用在视频监控全面联网、智能化升级的时代,单纯的点对点监控已无法满足复杂业务的需求。核心诉求在于:如何在一个平台上,随时随地、高效稳定…

2025出国留学机构综合实力榜:排名前十的留学中介特色分析

2025出国留学机构综合实力榜:排名前十的留学中介特色分析Posted on 2025-11-11 17:46 打不死的小强996 阅读(0) 评论(0) 收藏 举报在当前多元化的留学环境下,选择一家合适的出国留学中介成为许多家庭的重要决策…

公众号怎么起爆款标题?有什么好用的工具?

不知道你有没有这种感觉:公众号文章内容写得挺用心,但最后却卡在了起标题这一步。脑子里想来想去,就是那几个老套路,觉得没啥吸引力。 说实话,一个好的标题,真的决定了文章能不能被打开。我之前也特别头疼这个,…

邢台西林瓶灌装机优选指南:聚焦资质、案例与售后

在邢台地区,制药与生物制剂企业近年来对西林瓶灌装设备的需求持续增长。随着本地医药产业链的完善,越来越多中小型药企和科研机构开始关注设备采购中的价格适配性问题。根据2024年华北区域制药装备用户调研数据显示,…

基于SpringBoot+Vue的个人理财系统管理系统设计与建立【Java+MySQL+MyBatis完整源码】

基于SpringBoot+Vue的个人理财系统管理系统设计与建立【Java+MySQL+MyBatis完整源码】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

python使用PyInstaller打包成exe

PyInstaller是目前最流行的Python打包工具之一,其安装过程极为简便。在Windows系统上,只需通过pip命令即可完成安装: pip install pyinstaller 安装完成后,可通过pyinstaller --version验证安装是否成功。对于国内…

2025年机械磨优质厂家权威推荐榜单:冲击磨/小型机械磨/超微机械磨源头厂家精选

在粉体材料技术飞速发展的今天,机械磨作为实现物料超微化、精细化处理的核心装备,其性能直接决定了新能源、新材料、制药等高端领域的生产效能与产品质量。为帮助您精准定位优质供应商,本文基于企业研发实力、技术专…