HarmonyOS 5.0应用开发——NodeContainer自定义占位节点

【高心星出品】

文章目录

      • NodeContainer自定义占位节点
        • 案例
        • 开发步骤
        • 全部代码

NodeContainer自定义占位节点

NodeContainer是用来占位的系统组件,主要用于自定义节点以及自定义节点树的显示,支持组件的通用属性,对通用属性的处理请参考默认左上角对齐的Stack组件。

NodeController提供了一系列生命周期回调,通过makeNode回调返回一个 FrameNode 节点树的根节点。将FrameNode节点树挂载到对应的NodeContainer下。同时提供了aboutToAppear、aboutToDisappear、aboutToResize、onTouchEvent、rebuild五个回调方法用于监听对应的NodeContainer的状态。

在这里如果使用NodeContainer可以有两种使用方式:

nodecontainer-->nodectroller-->framnode--->typenode
nodecontainer-->nodectroller-->framenode-->buildernode-->builder构建函数
案例

下面我们编写一个案例,用typenode生成布局和用builder构建函数生成布局两种方式来创建framnode,并通过nodecontroller挂在到nodecontainer中。

运行结果

运行过程中"布局文本"是build函数中的组件,在其下面有builder构建函数生成的节点也有通过typenode生成的几点,我们通过按钮点击来切换。

在这里插入图片描述

开发步骤

全局构建函数

interface param{text1:stringtext2:string
}
// 全局构建函数
@Builder
function buildcontainer(p:param){Column({space:10}){Text(p.text1).fontSize(22)Text(p.text2).fontSize(22)}.width('100%').padding(10)
}

typenode生成函数

//使用typenode生成framenode
function gentypenode(uicontext:UIContext){let row=typeNode.createNode(uicontext,'Row')row.initialize()row.attribute.width('100%')row.attribute.padding(20)row.attribute.backgroundColor(Color.Red)row.attribute.justifyContent(FlexAlign.Center)let button=typeNode.createNode(uicontext,'Button')button.initialize('typenode节点')row.appendChild(button)return row
}

nodecontroller对象加载framenode

在这里面根据type选择挂载builder构建函数还是typenode,根据isshow决定是否显示布局。

rebuild方法会引起nodectroller重新调用makeNode方法。

class mynodectl extends NodeController{node:BuilderNode<[param]>|null=nullprivate isshow:boolean=true// 根据不同的type决定是typenode或者是构建函数private _type: string = 'builder'public settype(value: string) {this._type = value}constructor(type: string) {super()this._type = type}toshow(){this.isshow=true// 重新构建节点 重新调用makenode方法this.rebuild()}tohide(){this.isshow=false// 重新构建节点 重新调用makenode方法this.rebuild()}makeNode(uiContext: UIContext): FrameNode | null {if (!this.isshow){return null}if(this.node==null){// 将build构建函数转化成节点if(this._type=='builder') {this.node = new BuilderNode(uiContext)this.node.build(wrapBuilder<[param]>(buildcontainer), { text1: 'builder文本节点1', text2: 'builder文本节点2' })}else{return gentypenode(uiContext)}}return this.node.getFrameNode()}}

页面代码

这里面通过调用tohide或者toshow来调控布局的显示,通过settype来调控显示的布局内容是来自builder还是typenode。

@Entry
@Component
struct Nodecontainerpage {@State message: string = 'Hello World';// 定义节点对象nodelayout:mynodectl=new mynodectl('type')build() {Column({space:20}){Text('布局文本').fontSize(22).onClick(()=>{this.nodelayout.settype('builder')this.nodelayout.toshow()})//nodecontainer-->nodectroller-->framnode--->typenode//nodecontainer-->nodectroller-->framenode-->buildernode-->builder构建函数NodeContainer(this.nodelayout).onClick(()=>{this.nodelayout.tohide()})}.height('100%').width('100%')}
}
全部代码
import { BuilderNode, NodeController, typeNode, UIContext } from '@kit.ArkUI'interface param{text1:stringtext2:string
}
// 全局构建函数
@Builder
function buildcontainer(p:param){Column({space:10}){Text(p.text1).fontSize(22)Text(p.text2).fontSize(22)}.width('100%').padding(10)
}//使用typenode生成framenode
function gentypenode(uicontext:UIContext){let row=typeNode.createNode(uicontext,'Row')row.initialize()row.attribute.width('100%')row.attribute.padding(20)row.attribute.backgroundColor(Color.Red)row.attribute.justifyContent(FlexAlign.Center)let button=typeNode.createNode(uicontext,'Button')button.initialize('typenode节点')row.appendChild(button)return row
}class mynodectl extends NodeController{node:BuilderNode<[param]>|null=nullprivate isshow:boolean=true// 根据不同的type决定是typenode或者是构建函数private _type: string = 'builder'public settype(value: string) {this._type = value}constructor(type: string) {super()this._type = type}toshow(){this.isshow=true// 重新构建节点 重新调用makenode方法this.rebuild()}tohide(){this.isshow=false// 重新构建节点 重新调用makenode方法this.rebuild()}makeNode(uiContext: UIContext): FrameNode | null {if (!this.isshow){return null}if(this.node==null){// 将build构建函数转化成节点if(this._type=='builder') {this.node = new BuilderNode(uiContext)this.node.build(wrapBuilder<[param]>(buildcontainer), { text1: 'builder文本节点1', text2: 'builder文本节点2' })}else{return gentypenode(uiContext)}}return this.node.getFrameNode()}}@Entry
@Component
struct Nodecontainerpage {@State message: string = 'Hello World';// 定义节点对象nodelayout:mynodectl=new mynodectl('type')build() {Column({space:20}){Text('布局文本').fontSize(22).onClick(()=>{this.nodelayout.settype('builder')this.nodelayout.toshow()})//nodecontainer-->nodectroller-->framnode--->typenode//nodecontainer-->nodectroller-->framenode-->buildernode-->builder构建函数NodeContainer(this.nodelayout).onClick(()=>{this.nodelayout.tohide()})}.height('100%').width('100%')}
}
de//nodecontainer-->nodectroller-->framenode-->buildernode-->builder构建函数NodeContainer(this.nodelayout).onClick(()=>{this.nodelayout.tohide()})}.height('100%').width('100%')}
}

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

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

相关文章

26~31.ppt

目录 26.北京主要的景点 题目 解析 27.创新产品展示及说明会 题目​ 解析 28.《小企业会计准则》 题目​ 解析 29.学习型社会的学习理念 题目​ 解析 30.小王-产品展示信息 题目​ 解析 31.小王-办公理念-信息工作者的每一天 题目​ 解析 26.北京主要的景点…

单张照片可生成写实3D头部模型!Adobe提出FaceLift,从单一的人脸图像中重建出360度的头部模型。

FaceLift是Adobe和加州大学默塞德分校推出的单图像到3D头部模型的转换技术,能从单一的人脸图像中重建出360度的头部模型。FaceLift基于两阶段的流程实现:基于扩散的多视图生成模型从单张人脸图像生成一致的侧面和背面视图;生成的视图被输入到GS-LRM重建器中,产出详细的3D高斯表…

在Uniapp中使用阿里云OSS插件实现文件上传

在开发小程序时&#xff0c;文件上传是一个常见的需求。阿里云OSS&#xff08;Object Storage Service&#xff09;是一个强大的云存储服务&#xff0c;可以帮助我们高效地存储和管理文件。本文将介绍如何在Uniapp小程序中使用阿里云OSS插件实现文件上传功能。 1. 准备工作 首…

Tomcat添加到Windows系统服务中,服务名称带空格

要将Tomcat添加到Windows系统服务中&#xff0c;可以通过Tomcat安装目录中“\bin\service.bat”来完成&#xff0c;如果目录中没有service.bat&#xff0c;则需要使用其它方法。 打到CMD命令行窗口&#xff0c;通过cd命令跳转到Tomcat安装目录的“\bin\”目录&#xff0c;然后执…

Android Studio集成讯飞SDK过程中在配置Project的时候有感

在配置讯飞的语音识别SDK&#xff08;流式版&#xff09;时候&#xff0c;跟着写了两个Demo&#xff0c;一个是YuYinTestDemo01&#xff0c;另一个是02&#xff0c;demo01比较简单&#xff0c;实现功能图象也比较简陋&#xff0c;没用讯飞SDK提供的图片&#xff0c;也就是没用到…

DeepSeek 助力 Vue 开发:打造丝滑的进度条

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

NLP Word Embeddings

Word representation One-hot形式 在上一周介绍RNN类模型时&#xff0c;使用了One-hot向量来表示单词的方式。它的缺点是将每个单词视为独立的&#xff0c;算法很难学习到单词之间的关系。 比如下面的例子&#xff0c;即使语言模型已经知道orange juice是常用组合词&#xf…

CNN卷积神经网络多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址&#xff1a;CNN卷积神经网络多变量多步预测&#xff0c;光伏功率预测&#xff08;Matlab完整源码和数据) 标题&#xff1a;CNN卷积神经网络多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1 研究背景及意义 随着全球能源危机的加剧和环保意识的提升&#xff…

本地部署DeepSeek Nodejs版

目录 1.下载 Ollama 2.下载DeepSeek模型 3.下载 ollama.js 1.下载 Ollama https://ollama.com/ 下载之后点击安装&#xff0c;等待安装成功后&#xff0c;打开cmd窗口&#xff0c;输入以下指令&#xff1a; ollama -v 如果显示了版本号&#xff0c;则代表已经下载成功了。…

【Vue中BUG解决】npm error path git

报错内容如下&#xff1a; 从错误信息可知&#xff0c;这是一个 ENOENT&#xff08;No Entry&#xff0c;即找不到文件或目录&#xff09;错误&#xff0c;并且与 git 相关。具体来说&#xff0c;npm 在尝试调用 git 时&#xff0c;无法找到 git 可执行文件&#xff0c;下面为…

Jenkins+gitee 搭建自动化部署

Jenkinsgitee 搭建自动化部署 环境说明&#xff1a; 软件版本备注CentOS8.5.2111JDK1.8.0_211Maven3.8.8git2.27.0Jenkins2.319最好选稳定版本&#xff0c;不然安装插件有点麻烦 一、安装Jenkins程序 1、到官网下载相应的版本war或者直接使用yum安装 Jenkins官网下载 直接…

插入排序和希尔排序

目录 插入排序 插入排序代码实现&#xff1a; 插入排序思路&#xff1a; 希尔排序&#xff1a; 什么是希尔排序&#xff1a; 希尔排序代码实现&#xff1a; 希尔排序思路&#xff1a; 插入排序&#xff08;稳定&#xff09; 假设有这样一个数组&#xff0c;想要从小到大进行排…

elasticsearch

1、什么是elasticsearch elasticsearch被广泛用于日志分析、实时监控领域 elastic stack &#xff08;ELK&#xff09; ①kibana 数据可视化 ②elasticsearch存储、计算、搜索数据 ③Longstash、Beats 数据抓取 操作ES的语句称之为DSL语句 2、ES倒排索引 3、ES单节点安装…

【AcWing】蓝桥杯辅导课-数学与简单DP

目录 数学 买不到的数目 蚂蚁感冒 饮料换购 DP 01背包问题 摘花生 最长上升子序列 地宫取宝 波动数列 数学 买不到的数目 1205. 买不到的数目 - AcWing题库 这道题的意思就是给定两个正整数p和q&#xff0c;求xpyq这一个组合不能凑出来的最大正整数是多少 首先我们…

PyQt学习记录01——加法计算器

0. 安装配置 0.1 安装相关库 首先打开你的PyCharm程序&#xff0c;然后新建一个目录用于学习&#xff0c;其次在terminal中输入 pip install pyqt5如果你不具有科学上网能力&#xff0c;请改为国内源 pip install pyqt5 -i https://pypi.douban.com/simple然后安装pyqt相关…

[Linux] 信号(singal)详解(二):信号管理的三张表、如何使用coredump文件、OS的用户态和内核态、如何理解系统调用?

标题&#xff1a;[Linux] 信号管理的三张表、如何使用coredump文件、OS的用户态和内核态、如何理解系统调用&#xff1f; 水墨不写bug &#xff08;图片来源&#xff1a;文心一言&#xff09; 正文开始&#xff1a; 目录 一、信号管理的三张表 &#xff08;1&#xff09;三张表…

2025.2.11

1> 制作一个闹钟软件 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QTime> #include <QTimer> #include <QTimeEdit> #include <QDa…

和鲸科技上线 DeepSeek 系列模型服务,助力数智企业 AI 业务创新!

近日&#xff0c;和鲸科技团队宣布旗下数据科学协同平台 ModelWhale 实现对 DeepSeek 全系列大模型的深度支持&#xff0c;旨在帮助更多数智化转型企业提供从算力基建到业务融合的全栈式解决方案&#xff0c;快速搭建自主可控的云端智能服务体系&#xff0c;实现大模型与业务系…

使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器进行模型检查点处理

2023 年 11 月&#xff0c;Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元&#xff08;数据集和数据加载器&#xff09;的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发(文末联系,整套资料提供)

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发 一、系统介绍 随着人们生活水平的提高和健康意识的增强&#xff0c;智能健康监测设备越来越受到关注。智能腰带作为一种新型的健康监测设备&#xff0c;能够实时采集用户的腰部健康数据&#xff0c;如姿势、运动…