更多开源请访问:51CTO开源基础软件社区https://ost.51cto.comformcomponent简介用于展示桌面图标和卡片。卡片类似于Android上的widgets,可以显示在桌面上,也可以显示在其他一些系统服务页面中。展示卡片时,使用card_frontend解析html标记语言,与应用展示不同。OpenHarmony支持的应用界面开发有js-likeweb(hml+css+js)和ets两种声明式风格。显示卡片时,这种更轻的卡片样式(也是类似web的,hml+css+json)。虽然图标和卡片的来源和管理者不同,但用户之间并没有太大的区别。桌面上的app图标相当于一张1*1的卡片,实现点击跳转到应用,无需动态刷新(allowUpate=false)。下面以卡片的形式进行分析。代码位置/foundation/ace/ace_engine/frameworks/├──bridge│├──card_frontend│├──js_card_parser.h││├──js_card_parser.cpp││├──card_frontend.h││_├──card.cpp││├──card_frontend_delegate.h││└──card_frontend_delegate.cpp│└──declarative_frontend/jsview│├──js_form.h│└──js_form.cpp└──core├──common│├──form_manager.h│└──form_manager.cpp└──components/form├──resource│├──form_request_data.h│├──form_callback_client.h│├──form_manager_resource.h│├──form_manager_resource.cpp│├──form_manager_delegate.h│└──form_manager_delegate.cpp├──form_component.cpp├──form_component.h├──form_element.cpp├──form_element.h├──render_form_creator.cpp├──render_form.cpp├──render_form.h├──rosen_render_form.cpp├──rosen_render_form.h├──flutter_render_form.cpp├──flutter_render_form.h├──form_window.cpp├──form_window.h├──sub_container.cpp└──sub_container.hbridge/card_frontend虽然和declarative_frontend、js_frontend位于同一个目录,但它实际上是给sub_container使用的,目录之前并不是一种应用程序界面的方式。它是映射UI的作法。bridge/declarative_frontend/jsview下的js_form是一个ace引擎组件实例,将ets中的组件与c++关联起来。core/components/form下是ace引擎组件form_component。系统架构图1系统架构卡片提供者为ace_form_ability。卡片的内容是hml+css+json,ace_form_ability负责更新里面的数据。用户是ace_ability,显示卡首先在ace中创建组件form_component,其中的sub_container通过card_frontend解析前端hml+css+json显示。打个比方:formmgr相当于服务器,提供者相当于服务器上的服务,用户相当于客户端。form_component可以和卡片管理器formmgr通信,通知formmgr卡片被安装的事件。formmgr将激活能力通知卡提供者。图2类图关键类介绍了FormComponentAttribute和JSForm。sdk的ts接口和关联的c类。它们将应用程序中的控件转换为c对象。前端FormComponent创建时设置的属性包括:id,name,bundle,ability,module,dimension(1*2,2*2,2*4,4*4),temporary。interfaceFormComponentInterface{(value:{id:number;name:string;bundle:string;ability:string;module:string;dimension?:FormDimension;temporary?:boolean;}):FormComponentAttribute;}JSForm是在Create()中创建的FormComponent时,属性通过RequestFormInfo传递给FormComponent实例。设置的回调包括:onAcquired、onError、onRouter、onUninstall。FormComponent、FormElement、RenderForm[RosenRenderForm、FlutterRenderForm]。一套三件套的ace控件。请注意,RenderForm是从RenderSubContainer继承而来的。FormComponent持有卡片属性。FormElement在Prepare()中设置FormManagerDelegate的回调方法,在update()中创建SubContainer。RenderForm里面的内容很少,因为卡片的实际绘制是在SubContainer里面的。FormManagerDelegate。能够与管道和FormMgr通信。在标准系统中,卡片通过FormMgr进行管理;【在lite系统中,没有FormMgr,通过pipeline中的PlatformResRegister来管理】。通过FormCallbackClient调用FormMgr发起的ipc。表单管理器。在本地管理SubContainer的单个实例。子容器。卡片实际呈现的位置。outSidePipelineContext_是整个FormComponent的管道,pipelineContext_是SubContainer本身用来渲染卡片的管道。这两行代码可以说明两者的关系:auto&&window=std::make_unique
