HarmonyOS(65) ArkUI FrameNode詳解

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;//綁定buttonBuilderprivate 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,一個是粉色的buttonif (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) {//創建黑色方塊的FrameNodelet frameNode1 = new FrameNode(this.uiContext);//創建橘色方塊的FrameNodelet 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.pswp.cn/web/62564.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62564.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62564.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

詳解RabbitMQ在Ubuntu上的安裝

??????? 目錄 Ubuntu 環境安裝 安裝Erlang 查看Erlang版本 退出命令 ?編輯安裝RabbitMQ 確認安裝結果 安裝RabbitMQ管理界面 啟動服務 查看服務狀態 通過IP:port訪問 添加管理員用戶 給用戶添加權限 再次訪問 Ubuntu 環境安裝 安裝Erlang RabbitMq需要…

vue圖片之放大、縮小、1:1、刷新、左切換、全屏、右切換、左旋咋、右旋轉、x軸翻轉、y軸翻轉

先上效果&#xff0c;代碼在下面 <template><!-- 圖片列表 --><div class"image-list"><img:src"imageSrc"v-for"(imageSrc, index) in images":key"index"click"openImage(index)"error"handleI…

【計算機網絡】實驗12:網際控制報文協議ICMP的應用

實驗12 網際控制報文協議ICMP的應用 一、實驗目的 驗證ping命令和tracert命令的工作原理。 二、實驗環境 Cisco Packet Tracer模擬器 三、實驗過程 1.構建網絡拓撲并進行信息標注&#xff0c;將所需要配置的IP地址寫在對應的主機或者路由器旁邊&#xff0c;如圖1所示。 圖…

迭代器模式的理解和實踐

引言 在軟件開發中&#xff0c;我們經常需要遍歷容器對象&#xff08;如數組、列表、集合等&#xff09;中的元素。如果每個容器對象都實現自己的遍歷算法&#xff0c;那么代碼將會變得冗余且難以維護。為了解決這個問題&#xff0c;迭代器模式應運而生。迭代器模式是一種行為型…

TS2339: Property ‘value‘ does not exist on type ‘MessageBoxData‘.

1、源代碼 <template><el-dialog:visible"visible":before-close"handleClose":close-on-click-modal"false"title"邀請碼"width"1200px"append-to-bodydestroy-on-close><div class"invite-code-wrap…

ubuntu防火墻(三)——firewalld使用與講解

本文是Linux下&#xff0c;用ufw實現端口關閉、流量控制(二) firewalld使用方式 firewalld 是一個動態管理防火墻的工具&#xff0c;主要用于 Linux 系統&#xff08;包括 Ubuntu 和 CentOS 等&#xff09;。它提供了一個基于區域&#xff08;zones&#xff09;和服務&#x…

Windows 安裝配置 RabbitMQ 詳解

博主介紹&#xff1a; 計算機科班人&#xff0c;全棧工程師&#xff0c;掌握C、C#、Java、Python、Android等主流編程語言&#xff0c;同時也熟練掌握mysql、oracle、sqlserver等主流數據庫&#xff0c;能夠為大家提供全方位的技術支持和交流。 工作五年&#xff0c;具有豐富的…

R語言的數據結構--矩陣

【圖書推薦】《R語言醫學數據分析實踐》-CSDN博客 《R語言醫學數據分析實踐 李丹 宋立桓 蔡偉祺 清華大學出版社9787302673484》【摘要 書評 試讀】- 京東圖書 (jd.com) R語言醫學數據分析實踐-R語言的數據結構-CSDN博客 矩陣是一個二維數組&#xff0c;矩陣中的元素都具有相…

JAVA基礎學習筆記_反射+動態代理

文章目錄 反射獲取class對象的三種方式獲取構造方法獲取成員變量獲取成員方法反射的作用 動態代理 反射 允許對成員變量\成員方法\構造方法的信息進行編程訪問 把類內的信息扒的干干凈凈,獲取解剖 獲取從class字節碼文件中獲取 獲取class對象的三種方式 public static void …

微信小程序一鍵復制功能

wx.setClipboardData(Object object) 設置系統剪貼板的內容。調用成功后&#xff0c;會彈出 toast 提示"內容已復制"&#xff0c;持續 1.5s wx.setClipboardData({data: 你需要復制的內容,success (res) {wx.getClipboardData({success (res) {console.log(res.dat…

【Python網絡爬蟲 常見問題匯總】

目錄 1. 爬取圖片出現403解決辦法&#xff1a;設置請求頭中的Referer字段 2.關于干壞事的問題后續不定期更新 歡迎共同探討學習進步 1. 爬取圖片出現403 問題出自案例9&#xff0c;已解決。 【Python網絡爬蟲筆記】9- 抓取優美圖庫高清壁紙 當在爬取圖庫圖片時遇到 403 錯誤…

Linux: docker: 怎么修改 proc下的文件內容?

文章目錄 參考問題方法 1:在宿主機上修改參數方法 2:啟動容器時掛載 /proc 為可寫方法 3:通過 Kubernetes 調整配置方法 4:構建特權容器參考 https://docs.docker.com/security/for-admins/hardened-desktop/enhanced-container-isolation/features-benefits/#procfs–sys…

分布式 分布式事務 總結

前言 相關系列 《分布式 & 目錄》《分布式 & 分布式事務 & 總結》《分布式 & 分布式事務 & 問題》 分布式事務 所謂分布式事務是指操作范圍籠罩多個不同節點的事務。例如對于訂單節點&庫存節點而言&#xff0c;一次完整的交易需要同時調動兩個節…

STM32+模擬或硬件IIC+SHT20驅動問題:接上拉電阻、BUSY死鎖?

主要問題&#xff1a; 1&#xff0c;使用STM32F103C8T6&#xff0c;模擬IIC&#xff0c;SCL和SDA口配置為推挽輸出上拉&#xff0c;主要是SDA腳&#xff0c;每次都要輸出輸入模式重新配置&#xff0c;雖然也能通信&#xff0c;但不穩定&#xff0c;出錯率大&#xff1b; 2&…

【工業機器視覺】基于深度學習的水表盤讀數識別(3-數據標注與轉換)

【工業機器視覺】基于深度學習的儀表盤識讀&#xff08;2&#xff09;-CSDN博客 數據標注 標注擴展 Labelme 和 LabelImg 都是用于創建機器學習和計算機視覺項目所需標注數據的工具。它們都允許用戶通過圖形界面手動標注圖像&#xff0c;但各自有其特點和適用場景。 Labelme…

靜態路由與交換機配置實驗

1.建立網絡拓撲 添加2臺計算機&#xff0c;標簽名為PC0、PC1&#xff1b;添加2臺二層交換機2960&#xff0c;標簽名為S0、S1&#xff1b;添加2臺路由器2811&#xff0c;標簽名為R0、R1&#xff1b;交換機劃分的VLAN及端口根據如下拓撲圖&#xff0c;使用直通線、DCE串口線連接…

【Spark】Spark Join類型及Join實現方式

Spark Join類型 1. Inner Join (內連接) 示例&#xff1a;val result df1.join(df2, df1("id") df2("id"), "inner")執行邏輯&#xff1a;只返回那些在兩個表中都有匹配的行。 2. Left Join (左外連接) 示例&#xff1a;val result df1.jo…

socket UDP 環路回顯的服務端

基于socket通訊的方式&#xff0c;無論用http或者udp或者自定義的協議&#xff0c;程序結構都是類似的。這個以UDP協議為例簡要說明。 #include <stdio.h> // 標準輸入輸出庫 #include <sys/types.h> // 提供了一些數據類型&#xff0c;如ssize_t #include <sy…

Linux:network:添加ip的時候自動添加一個本地路由

文章目錄 問題問題 最近在看一個路由的問題,順便看內核代碼,發現在添加IP的時候,內核會自動添加一個local route。 net/ipv4/devinet.c inet_rtm_newaddr->__inet_insert_ifa /* Send message first, then call notifier.Notifier will trigger FIB update, so thatlis…

Magnet Player:一款基于Web的磁力鏈媒體播放器

Magnet Player&#xff1a;一款基于Web的磁力鏈媒體播放器 項目地址:https://gitcode.com/gh_mirrors/ma/magnet-player 是一個創新的開源項目&#xff0c;它允許用戶直接在瀏覽器中播放磁力鏈&#xff08;Magnet URI&#xff09;內容&#xff0c;無需下載或安裝任何桌面應用…