当前位置: 首页 > 科技观察

HarmonyOS应用开发-组件系统介绍(一)_0

时间:2023-03-11 20:27:45 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区HarmonyOSUIFrameworkhttps://harmonyos.51cto.com/#zz其中,Component为用户界面提供基本组件。Component类位于ohos.agp.components包中,直接派生自java.lang.Object,是HarmonyOS所有界面组件的直接或间接父类。每个组件在屏幕上占据一个矩形区域,它在其中响应绘图和事件处理。Conpoment是其他控件的基类,用于创建各种交互组件。Component的直接子类ComponentContainer是所有布局的基类,为其他组件或组件组定义布局属性。我们来看看HarmonyOS中Component的继承体系(橙色边框类只列出了部分子类):Component有6个直接子类组件,这6个组件从功能上可以分为两类,一类是显示类类交互组件如Text、Image、IindexBar、ProcessBar和PageSliderIndicator,另一种是容器组件ComponentContainer及其子类,用于容纳其他布局或组件。值得注意的是,ComponentContainer类是一个抽象类,是所有布局或容器组件使用的父类。为了便于理解,下图展示了一个简单网站页面的组成结构:从上图中可以看出,最外层的Layout1是布局组件,用于容纳其他类型的组件;head是一个Image组件,用来展示图片,中间部分的左边是一个类似列表的容器组件,用来容纳多个Text组件;中间部分右侧是一个Layout组件,依此类推,最下面的Layout3组件包含两个Button组件。以上只是一个简单页面的组件示例。在实际的开发过程中,在正式编码之前一定要做好页面规划,这样才能在开发过程中对自己的页面整体有一个清晰的认识。了解了Component类是什么之后,我们来介绍一下Component类的内部构成。首先,Component类是一个嵌套类(其他组件类也是嵌套类)。许多内部类/接口是在Component类中定义的。此外,还定义了各种获取和设置组件属性信息的方法。1、组件的内部类/接口组件的内部类通常是一个监听器(多以Listener结尾),用于回调响应界面元素的变化。在HarmonyOS中,为组件注册监听器是系统自动注册的,响应事件的回调方法也是操作系统自动调用的。其次,这些监听器主要用于监听单击、双击、长按、绘制界面元素等事件。在这些事件中,程序员可以在回调方法中自定义事件处理逻辑来响应这些事件。下面的代码片段展示了如何为Button设置事件监听://为按钮设置点击回调:第一种写法,直接实例化监听接口,实现回调方法onClickButtonbutton=(Button)findComponentById(ResourceTable.Id_button);button.setClickedListener(newComponent.ClickedListener(){@OverridepublicvoidonClick(Componentcomponent){/*开发者可以自定义事件处理逻辑,比如获取组件,启动新能力等*/Texttext=(Text)component.findComponentById(ResourceTable.Id_type_text);}});/*为按钮设置点击回调:第二种写法,lambda表达式方式,前提是知道监听器中方法的参数列表:方法中的参数个数下面的"(component)"和监听器中的方法onClick的参数个数是一样的*/Buttonbutton=(Button)findComponentById(ResourceTable.Id_button);button.setClickedListener((component)->{/*Developerscan自定义事件处理逻辑,如获取组件、启动新的能力等*/Texttext=(Text)component.findComponentById(ResourceTable.Id_type_text);});在上面的代码片段中,有两种方式演示了如何获取组件元素和设置组件的点击事件监听器。第一种方法是通过实例化Component内部静态接口ClickedListener为按钮设置监听器,开发者需要实现监听器的onClick方法来编写具体的业务逻辑代码。在第二种方法中,使用了lambda表达式。setClickedListener的参数是一个函数。这个方法比较简单,但是前提是开发者需要知道组件监听器回调方法的参数列表。例如,按钮的onClick方法只有一个参数。组件,给其他组件添加监听时,也推荐使用lambda方式。为了加强理解,我们以ListContainer为例,给ListContainer的列表元素添加点击事件:ListContainernewsListContainer=findComponentById(ResourceTable.Id_news_container);newsListContainer.setItemClickedListener((listContainer,component,i,l)->{/*开发者可以自定义事件处理逻辑,如获取组件、启动新能力等*/Texttext=(Text)component.findComponentById(ResourceTable.Id_type_text);});上面的代码片段中,setItemClickedListener也是使用lambda表达式设置监听器,如果使用普通方法,下面的代码片段需要实例化ListContainer.ItemClickedListener接口并实现onItemClicked方法:ewsListContainer.setItemClickedListener(newListContainer.ItemClickedListener(){@OverridepublicvoidonItemClicked(ListContainerlistContainer,Componentcomponent,inti,longl){/*开发者可以自定义事件处理逻辑,比如获取组件,启动新能力等*/Texttext=(Text)component.findComponentById(ResourceTable.Id_type_text);}});细心的朋友可能会发现,获取Button组件时直接使用findComponentById方法,获取Text组件时使用component.findComponentById方法,这两种方法有什么区别呢?其实在Component类中,定义了获取指定组件的findComponentById方法;并且在Ability类中也声明了获取组件的findComponentById方法,但是内部仍然传递了Ability的findComponentById方法。在Component类中调用findComponentById获取组件了解了这两种获取组件的方法后,就可以根据实际需要选择合适的方法获取组件信息了。2.Component方法介绍Component类中定义了数十种方法来设置和获取组件信息,方便开发者创建自己的应用程序。这些方法大致可以分为以下几类,篇幅原因不一一列举:1)设置并获取组件布局信息,如position、margin等。(1)publicintgetBottom();获取组件相对于父布局的下边缘位置。(2)publicint[]getMargins();获取此组件的左、上、右和下边距。(3)publicint[]publicintgetPaddingLeft();获取组件的左填充。2)设置和获取组件绘图属性信息,如尺寸、边角样式、可见性等。(1)publicintgetHeight();获取组件的高度。(2)publicvoidsetFocusBorderRadius(float[]半径);设置获得焦点的边框圆角(3)publicvoidsetVisibility(intvisibility);设置组件的可见性。3)设置和获取组件状态信息,如焦点、是否可以点击、是否可用等(1)publicintgetFocusable();获取组件是否可以获得焦点(2)publicvoidsetClickable(booleanclickable);设置组件是否可以点击。(3)publicvoidsetEnabled(booleanenabled);设置组件是否可用4)设置值组件监听器和上下文信息(1)publicvoidsetClickedListener(Component.ClickedListenerlistener);为组件设置点击事件监听(二)publicContextgetContext();获取当前组件持有的上下文信息。2.总结在HarmonyOS应用开发过程中,非常有必要对组件继承体系和组件的能力有一个整体的了解,这样在开发过程中才能做到心中有数。学会了如何使用一个组件,自然而然就会学会如何使用其他组件,不用再为众多组件的特性所困扰。在接下来的几篇文章中,您将注意Component类的直接子组件的解释。由于个人水平有限,如文章知识点有错误或不当之处,欢迎各位朋友积极指正,深入交流。微信公众号:想了解更多架构,请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz