HarmonyOS(65) ArkUI FrameNode详解

news2025/1/11 2:35:19

Node

  • 1、Node简介
  • 2、FrameNode
    • 2.1、创建和删除节点
    • 2.2、对FrameNode的增删改
    • 2.3、 FramNode的查询功能
  • 3、demo源码
  • 4、总结
  • 5、参考资料

1、Node简介

在HarmonyOS(63) ArkUI 自定义占位组件NodeContainer介绍了自定义节点复用的原理(阅读本本篇博文之前,建议先读读这个),在NodeController里有有个makeNode方法:


class MyNodeController extends NodeController {
   
  private buttonNode: BuilderNode<[Params]> | null = null;
  //绑定buttonBuilder
  private wrapBuilder: WrappedBuilder<[Params]> = wrapBuilder(buttonBuilder);
  //当实例绑定的NodeContainer创建的时候进行回调。回调方法将返回一个节点,将该节点挂载至NodeContainer。
 //或者可以通过NodeController的rebuild()方法进行回调的触发。
  makeNode(uiContext: UIContext): FrameNode {
   
    if (this.buttonNode == null) {
   
      //关于BuilderNode下文有所说明
      this.buttonNode = new BuilderNode(uiContext);
 
      this.buttonNode.build(this.wrapBuilder, {
    text: "This is a Button" })
    }
    //返回FrameNode对象,返回的节点将被挂载至NodeContainer的占位节点上。若返回null对象,将清空对应NodeContainer的子节点。
    return this.buttonNode!.getFrameNode()!;
  }
}

在make方法里有两个核心概念:FrameNode、BuilderNode,今天这篇博文就来学习FrameNode。
在这里插入图片描述
自定义节点的挂载和显示需要依赖自定义占位节点。现有的自定义节点包括FrameNode、RenderNode、BuilderNode三类对象。FrameNode表示了单个的自定义组件节点(可以对比Android的View),RenderNode表示更加轻量级的渲染节点,BuilderNode对象提供了能够创建、更新原生组件以及组件树的能力。

2、FrameNode

FrameNode表示组件树的实体节点,配合自定义占位容器组件NodeContainer等,在占位容器内挂载一棵自定义的节点树,并对这个节点树中的节点进行动态的增加、修改、删除等操作。基础的FrameNode可以设置通用属性、设置事件回调,并提供完整的自定义能力,包括自定义测量、布局以及绘,具体可以分为两大类能力:完全自定义节点的能力以及原生组件节点代理的能力,可以类比AndroidView/ViewGroup来理解FrameNode,可以通过FrameNode](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-user-defined-arktsnode-framenode-V5)实现类似Android自定义View的功能,。

  • 完全自定义节点:提供完整的自定义能力,包括自定义测量、布局以及绘制,支持节点的动态增、删,设置通用属性,设置事件回调。适用于不自带渲染引擎,需要依赖系统的布局、事件、动画、渲染等能力的场景。

  • 原生组件代理节点:提供原生组件的代理能力,提供遍历节点树的能力,通过组件树上的FrameNode可以遍历整个组件树,并通过节点访问组件的信息或者注册额外的事件监听回调,代理节点可以用于需要遍历整个UI的树形结构,并支持获取原生组件节点的具体信息或者额外注册组件的事件监听回调。适用于结合无感监听的接口实现打点、广告SDK、中台DFX等业务。

2.1、创建和删除节点

FrameNode提供了节点创建和删除的能力。可以通过FrameNode的构造函数创建自定义FrameNode节点,通过构造函数创建的节点对应一个实体的节点。同时,可以通过FrameNode中的dispose接口来实现与实体节点的绑定关系的解除。
示例片段如下,全部代码传送门,文章后面也会有全部代码:

public buttonNode: BuilderNode<[Params]> | null = null;
 public frameNode: FrameNode | null = null;
 public rootNode: FrameNode | null = null;
makeNode(uiContext: UIContext): FrameNode | null {
   
    this.uiContext = uiContext;
    if (this.rootNode == null) {
   
      this.rootNode = new FrameNode(uiContext);
      this.rootNode.commonAttribute
        .width("50%")//占屏幕宽度的一半
        .height(100)
        .borderWidth(1)
        .backgroundColor(Color.Gray)
    }

    if (this.frameNode == null) {
   
      //粉色矩形
      this.frameNode = new FrameNode(uiContext);
      this.frameNode.commonAttribute
        .width("100%")
        .height(50)//高度是rootNode的一半
        .borderWidth(1)
        .position({
    x: 200, y: 0 })//位置信息
        .backgroundColor(Color.Pink);
      this.rootNode.appendChild(this.frameNode);
    }
    //生成两个button,一个是橘黄色的button,一个是粉色的button
    if (this.buttonNode == null) {
   
      this.buttonNode = new BuilderNode<[Params]>(uiContext);
      this.buttonNode.build(this.wrapBuilder, {
    text: "This is a Button" })
      this.rootNode.appendChild(this.buttonNode.getFrameNode())
    }
    return this.rootNode;
  }

上面代码告诉我们可以通过两种方式获取FrameNode:
1、直接new FrameNode创建一个FrameNode。
2、通过BuilderNode对象的getFrameNode方法获取FrameNode

上面代码创建了三个FrameNode:rootNode、frameNode、buttonNode最终运行效果如下:
在这里插入图片描述
我们可以通过如下方法对rootNode、frameNode、buttonNode进行正删改查功能

2.2、对FrameNode的增删改

为了测试FrameNode的增删改,定义了如下方法:

//该方法在MyNodeController类中
operationFrameNodeWithFrameNode(frameNode: FrameNode | undefined | null) {
   
    if (frameNode) {
   
      console.log(TEST_TAG + " get ArkTSNode success.")
      //调用isModifiable方法判断是否FrameNode可以修改
      console.log(TEST_TAG + " check rootNode whether is modifiable " + frameNode.isModifiable());
    }
    if (this.uiContext) {
   
      //创建黑色方块的FrameNode
      let frameNode1 = new FrameNode(this.uiContext);
      //创建橘色方块的FrameNode
      let frameNode2 = new FrameNode(this.uiContext);
      //设置位置信息
      frameNode1.commonAttribute.size({
    width: 50, height: 50 })
        .backgroundColor(Color.Black)
        .position({
    x: 50, y: 60 })
      frameNode2.commonAttribute.size({
    width: 50, height: 50 })
        .backgroundColor(Color.Orange)
        .position({
    x: 120, y: 60 })
      try {
   
        //插入节点
        frameNode?.appendChild(frameNode1)

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

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

相关文章

Elasticsearch使用(2):docker安装es、基础操作、mapping映射

1 安装es 1.1 拉取镜像 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/elasticsearch:7.17.3 1.2 运行容器 运行elasticsearch容器&#xff0c;挂载的目录给更高的权限&#xff0c;否则可能会因为目录权限问题导致启动失败&#xff1a; docker r…

java实现SpringBoot项目分页查询和消费的方法

简介 why&#xff1a; 最近在项目中&#xff0c;有一个sql需要查询100多万的数据&#xff0c;且需要在代码中遍历处理。面临两个问题 一次性查询出太多数据&#xff0c;速度较慢当前服务器内存支持以上操作&#xff0c;但是随着数据量的增多&#xff0c;以后可能会出现内存溢出…

专为高性能汽车设计的Armv9架构的Neoverse V3AE CPU基础知识与软件编码特性解析

一、ARMv9以及V3AE处理器架构 Armv9架构的Arm Neoverse V系列处理器是专为高性能计算设计的产品线&#xff0c;其中V3AE&#xff08;Advanced Efficiency&#xff09;特别强调了性能与效率之间的平衡。以下是关于Armv9架构下Neoverse V3AE处理器结构和指令集的一些详细解读&am…

Python数据清洗之重复数据处理

大家好&#xff0c;在数据处理和分析的过程中&#xff0c;重复数据是一个常见的问题。重复的数据不仅会影响数据的准确性&#xff0c;还可能导致模型训练中的偏差。因此&#xff0c;检测并清理重复数据是数据清洗中的重要步骤。Python 的 Pandas 提供了强大的功能来检测、标记和…

【实战教程】使用YOLO和EasyOCR实现视频车牌检测与识别【附源码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

【项目实战】基于python+爬虫的电影数据分析及可视化系统

注意&#xff1a;该项目只展示部分功能&#xff0c;如需了解&#xff0c;文末咨询即可。 本文目录 1.开发环境2 系统设计 2.1 设计背景2.2 设计内容 3 系统页面展示 3.1 用户页面3.2 后台页面3.3 功能展示视频 4 更多推荐5 部分功能代码 5.1 爬虫代码5.2 电影信息代码 1.开发环…

SDXL的优化工作

本文详细介绍SDXL在SD系列的基础上做了什么优化&#xff0c;包括模型架构优化和训练过程数据的相关优化策略。 目录 Stable Diffusion XL核心基础内容 SDXL整体架构初识 Base模型 Refiner模型 Base——VAE Base——U-Net Base——Text Encoder Refiner GPT补充【TODO】 SDXL官方…

计算机网络 —— HTTPS 协议

前一篇文章&#xff1a;计算机网络 —— HTTP 协议&#xff08;详解&#xff09;-CSDN博客 目录 前言 一、HTTPS 协议简介 二、HTTPS 工作过程 1.对称加密 2.非对称加密 3.中间人攻击 4.引入证书 三、HTTPS 常见问题 1.中间人能否篡改证书&#xff1f; 2.中间人能否调…

YonBuilder移动开发——调用手机系统的浏览器打开网页

概述 在YonBuilder移动开发中&#xff0c;可以通过使用引擎提供的 api.openWin 或者 api.openFrame 函数方法通过内置的浏览器引擎在App内部打开相关的远程H5网站的网页。但是在实际项目开发中&#xff0c;可能会有一种需求&#xff0c;调用手机操作系统提供的系统浏览器去打开…

美畅物联丨视频接入网关如何配置 HTTPS 证书

在安防领域&#xff0c;视频接入网关&#xff08;Video Access Gateway&#xff0c;VAG&#xff09;是视频监控系统的重要组成部分&#xff0c;其职责是把视频数据从前端设备传输至后端服务器。配置HTTPS证书后&#xff0c;可对视频流进行加密传输&#xff0c;避免数据在网络传…

Redis原理—2.单机数据库的实现

大纲 1.Redis数据库的结构 2.读写Redis数据库键值时的处理 3.Redis数据库的构成 4.Redis过期键的删除策略 5.Redis的RDB持久化 6.Redis的AOF持久化 7.Redis的AOF重写机制 8.Redis持久化是影响其性能的高发地 9.Redis基于子进程实现持久化的使用建议 10.Redis持久化的…

Android平台GB28181设备接入模块动态文字图片水印技术探究

技术背景 前几年&#xff0c;我们发布的了Android平台GB28181设备接入模块&#xff0c;实现了不具备国标音视频能力的 Android终端&#xff0c;通过平台注册接入到现有的GB/T28181—2016或GB/T28181—2022服务。 Android终端除支持常规的音视频数据接入外&#xff0c;还可以支…

TaskBuilder SQL执行工具

为了方便开发者连接当前任擎服务器上配置的各个数据源对应的数据库进行相关操作&#xff0c;TaskBuilder提供了一个SQL执行工具&#xff0c;点击系统侧边栏里的执行SQL图标 &#xff0c;即可打开该工具&#xff0c;界面如下图所示&#xff1a; 该工具从上至下分为三个区域&a…

Redis中pipeline(管道)详解

redis管道pipeline 举个例子&#xff1a; 小卖铺免费让你拿50瓶饮料&#xff0c;你是一次拿一瓶拿回家&#xff0c;还是打包一次或者多次拿回家&#xff1f; 概念 Redis管道(pipelining)是一种在客户端向服务端发送多个请求而不等待响应的技术。它可以显著提高Redis应用程序…

01-Chromedriver下载与配置(mac)

下载地址&#xff1a; 这里我用的最后一个&#xff0c;根据自己chrome浏览器选择相应的版本号即可 ChromeDriver官网下载地址&#xff1a;https://sites.google.com/chromium.org/driver/downloads ChromeDriver官网最新版下载地址&#xff1a;https://googlechromelabs.git…

【Linux操作系统】Linux常用一键脚本

Linux网络加速脚本 Linux网络加速脚本可以替换Linux内核和更改TCP拥塞算法的一键脚本&#xff0c;包括安装BBR内核、XANMOD官方内核&#xff0c;开启BBR加速等功能&#xff0c;总之非常强大。 不卸载内核脚本&#xff08;一般用这个&#xff09; wget -O tcpx.sh "http…

Linux -文件系统的备份

本文为Ubuntu Linux操作系统- 第九弹~~ 今天接着上文的内容&#xff0c;讲Linux磁盘存储管理最后一部分内容~ 上期回顾&#xff1a;Linux 图形界面工具管理磁盘分区和文件系统 &#x1f60e;黑犀铠甲合体&#xff0c;流星枪之狂瀑扎帖&#xff0c;碎魔伏暴&#xff0c;灭于狂瀑…

ECharts实战教程:如何生成动态水波纹效果

导语&#xff1a;在数据可视化领域&#xff0c;ECharts是一款非常强大的图表库。今天&#xff0c;我们将带领大家学习如何使用ECharts生成动态水波纹效果&#xff0c;让我们的图表更加生动有趣。 一、准备工作 首先&#xff0c;我们需要准备一些基础数据&#xff0c;如下所示&…

PyQt信号槽实现页面的登录与跳转 #页面进一步优化

将登录框中的取消按钮使用信号和槽的机制&#xff0c;关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为"123456",如果账号密码匹配成功&#xff0c;当前界面关…

STM32CUBEMX+STM32F405RGT6+I2C+AT24C02学习应用

I2C 通讯 机制 较为 繁琐 &#xff0c; 但是I2C的速率比较低&#xff0c;而且EEPROM的容量不大&#xff0c;比如AT24C02的容量 只有 2Kb&#xff0c;即256B&#xff08;字节&#xff09;。 对于 想快速实现I 2 C 功能应用&#xff0c;我们借助STM32的HAL库函数 可以 做到 。 一…