OpenHarmony 的UI開發(fā)框架—ACE代碼框架總結(jié)

??想了解更多關(guān)于開源的內(nèi)容,請?jiān)L問:??
一、ACE_Engine框架概述:
ACE_Engine框架是OpenHarmony 的UI開發(fā)框架,提供開發(fā)者在進(jìn)行應(yīng)用UI開發(fā)時(shí)所必需的各種組件,以及定義這些組件的屬性,樣式,事件及方法。通過這些組件可以很方便的進(jìn)行OpenHarmony上UI應(yīng)用的開發(fā)。
ACE_Engine提供的組件分為兩種類型,即:類Web開發(fā)范式類型和聲明式開發(fā)范式類型。其中類Web開發(fā)范式中定義一個(gè)頁面需要三個(gè)文件,html,css和js文件。html文件負(fù)責(zé)頁面布局,css文件負(fù)責(zé)定義組件的樣式,js文件負(fù)責(zé)業(yè)務(wù)邏輯實(shí)現(xiàn)。而聲明式范式僅需要1個(gè)ets文件,頁面布局和組件的樣式以及業(yè)務(wù)邏輯實(shí)現(xiàn)都在此文件中。
如圖:

二、ACE_Engine框架模塊劃分
對于類Web開發(fā)范式組件,根據(jù)組件從前端到后端的過程,可以將整個(gè)框架劃分為JsFrameWork,DomNode, ComPonent, RenderNode四個(gè)模塊。
其作用分別如下:
1、JsFrameWork:
負(fù)責(zé)解析前端html和css文件,創(chuàng)建出DomNode樹。該樹的結(jié)構(gòu)和前端頁面是一一對應(yīng)的。
2、DomNode:
負(fù)責(zé)將Dom樹轉(zhuǎn)換為Component樹。注意一個(gè)Dom節(jié)點(diǎn)轉(zhuǎn)換過后的Component節(jié)點(diǎn)實(shí)際上并不是一個(gè)單獨(dú)的節(jié)點(diǎn),而是一顆以rootComponent為跟節(jié)點(diǎn)的組件樹。該樹中逐層包裹了對應(yīng)的功能組件,最內(nèi)部才是真正的主節(jié)點(diǎn)(這樣的作用是功能解耦合,將某一特定的功能放到對應(yīng)的組件中去)。如BoxComponet負(fù)責(zé)組件的邊框繪制,DisplayComponent負(fù)責(zé)組件透明度繪制,TouchComponent負(fù)責(zé)組件觸摸時(shí)間的處理等。一個(gè)詳細(xì)過程見DOMNode::GenerateComponentNode函數(shù)。
3、ComPonent:
負(fù)責(zé)將Component樹中所有繼承自RenderComponent的節(jié)點(diǎn)(可繪制節(jié)點(diǎn))創(chuàng)建對應(yīng)的RendNode節(jié)點(diǎn),生成對應(yīng)的RendNode樹。見RenderComponent ::CreateRenderNode虛函數(shù),
4、RenderNode:
RenderNode即可繪制的節(jié)點(diǎn),負(fù)責(zé)組件的最終布局和繪制。其中布局函數(shù)為PerformLayout虛函數(shù),由每個(gè)組件對應(yīng)的實(shí)現(xiàn)類Render類來實(shí)現(xiàn)。繪制函數(shù)為Paint虛函數(shù),由每個(gè)組件對應(yīng)的子類FlutterRender類來實(shí)現(xiàn)。
對于聲明式開發(fā)范式組件,根據(jù)組件從前端到后端的過程,可以將整個(gè)框架劃分為EtsLoader,JsView, ComPonent, RenderNode四個(gè)模塊。
其作用分別如下:?
1、EtsLoader
負(fù)責(zé)解析ets頁面,根據(jù)組件的tag標(biāo)簽創(chuàng)建對應(yīng)的JsView對象,生成jsView樹。
2、JsView
負(fù)責(zé)處理組件的屬性,方法和事件。并通過Create函數(shù)創(chuàng)建對應(yīng)的Component樹。
3、ComPonent:
同Web開發(fā)范式組件中的Component
4、RenderNode:
同Web開發(fā)范式組件中的RenderNode
各模塊創(chuàng)建示意圖如下圖所示:

各模塊見的調(diào)用關(guān)系及主要函數(shù)如下:

三、組件的屬性/樣式的傳遞過程
1.組件的屬性和樣式是保存在前端頁面的,通過JsframeWork解析頁面,并調(diào)用JsEngine的CreateDomNode接口創(chuàng)建Dom節(jié)點(diǎn)的同時(shí)傳遞新節(jié)點(diǎn)屬性和樣式。如果頁面中屬性樣式發(fā)生變化,則單獨(dú)調(diào)用SetAttr或SetStyle來更新屬性和樣式。
2.DomNode收到屬性和樣式之后,會將通用屬性保存在Declation類中,將組件特有的屬性通過SetSpecialAttr和SetSpectialStyle函數(shù)保存在自身。
3.DomNode調(diào)用對應(yīng)Component類的Set***函數(shù),將所有屬性和樣式設(shè)置到Component中。
4.RenderNode創(chuàng)建后,會調(diào)用其Update函數(shù)。該函數(shù)內(nèi)調(diào)用對應(yīng)Component的Get***函數(shù),來接收組件的所有屬性和樣式。
5.在PipeLine中會遍歷每個(gè)RenderNode進(jìn)行布局和繪制,此時(shí),就依據(jù)RenderNode中接收的屬性和樣式,進(jìn)行布局并繪制。

四、總結(jié)
ACE_Engine框架整體代碼較復(fù)雜,涉及的類也比較多。本文簡單介紹了一個(gè)ACE組件從前端的頁面描述,到中間層三棵樹的創(chuàng)建和屬性傳遞,以及最終進(jìn)行UI布局和繪制的整個(gè)過程。該過程簡單總結(jié)一下就是:JS頁面 —> Dom樹 —> Component樹 —> Render樹,最后繪制Render樹。大家只要理解這個(gè)基本過程,在結(jié)合代碼關(guān)注重點(diǎn)流程。相信一定能夠?qū)CE_Engine框架的代碼有整體的理解。再此基礎(chǔ)上可以進(jìn)行ACE組件的增強(qiáng)功能開發(fā),包括新增一個(gè)ACE組件等。















 
 
 












 
 
 
 