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

通过写计算器学习ArkUI组件

时间:2023-03-18 20:54:05 科技观察

想了解更多,请访问:鸿蒙科技社区,与华为共建官方https://ost.51cto.com想做程序做的事,首先要明确自己想要什么,通过分析题目思考程序需要什么信息,如何与用户交互,以什么形式反馈给用户(即UI设计),最后完成整个应用程序通过运行和调试程序开发。1.Whattodo做多功能计算器,包括标准计算器、科学计算器、程序计算器、抵押计算器等2.做什么样的计算器,为用户提供多功能选择,通过按钮交互,显示文字反馈,并通过一系列的数据处理,最终将正确的价值反馈给用户。可以用图片或者demo来确认是否符合预期,以免造成决策返工(本节以标准计算器为例,其他例子不再赘述)。1、分析整个页面分为三部分,标题栏、展示区、功能按钮区。标题栏:通过点击图标切换不同的计算器,同时提供历史查询。显示区:通过两个文本组件分别显示输入的计算表达式和计算结果。功能键区:功能键区分为功能键(如清除、返回等)、符号键(如加号、减号等)、数字键(0-9数字键)。2、使用到的知识点分析完要实现的标准计算器的UI界面,从中提炼出要使用到的技术。要实现设计好的UI界面,需要了解ArkUI的【Layoutconstraints】。三个区块的自顶向下布局,需要了解【FlexLayout】或者【ColumnContainerComponent】。对于三个块中元素(组件)的排列,需要了解【FlexLayout】或【RowContainerComponent】。UI界面中的点击选择,需要了解【菜单控制】。对于UI界面中的单个按钮元素(组件),需要了解【按钮组件】和【点击事件】。对于UI界面中的单个文本显示元素(组件),需要了解【文本组件】和【@State组件状态管理】。三、编写代码1、分析示例代码。创建项目和目录结构。在了解ArkUI的一些概念和熟悉应用程序的结构中已经介绍过。如有必要,您可以检查它。打开index.ets文件,示例代码实现了HelloWorld在页面中央的显示,我们先来了解一下每一行代码的含义。@Entry@ComponentstructIndex{build(){...}}1.1@EntryDecorator@Entry注解(装饰,我更喜欢叫它注解)自定义组件(ArkUI中一切都是组件,使用已有的组件组合构成页面)作为页面的默认入口,也可以理解为页面的根节点。页面加载时,首先创建并渲染带@Entry注解的组件,一个页面中只能使用一个@Entry注解,只有带@Entry注解的组件或子组件才会显示在页面上。1.2@Component装饰器被@Component注解(装饰)的代码块具有组件化能力,可以成为一个独立的组件。这种类型的组件也称为自定义组件。UI结构必须在build()方法中描述,不能自定义Constructor。//这种写法是错误的,因为缺少build()方法//报错struct'MyComponent'mustatatleastortomostone'build'method.@ComponentstructMyComponent{Flex(){}}自定义组件有具有以下特点:Composable:可以使用内置组件、其他组件、公共属性和方法来组合所需的UI结构,例如使用Text和Button组件自定义弹出组件。可复用:自定义组件可以被其他组件复用,在不同的父组件或容器中作为不同的实例使用。例如,自定义弹出窗口可以重复使用多次。生命周期:组件中可以配置生命周期的回调方法进行业务逻辑处理。数据驱动更新:由状态变量的数据驱动,UI自动更新。1.3build()函数(方法)build()满足Build构造函数接口的定义,用于定义组件的声明式UI描述。在构建方法中以声明的方式组合自定义组件或系统内置组件,构建方法将在组件创建和更新场景中被调用。构建方法只支持复合组件,使用渲染控制语句。build(){Flex({direction:FlexDirection.Column,alignItems:ItemAlign.Center,justifyContent:FlexAlign.Center}){Text('HelloWorld').fontSize(50).fontWeight(FontWeight.Bold)}.width('100%').height('100%')}2.flex容器组件和flex布局通过3.1节的理解,我们可以在@Entry和@Componet注解的代码块中使用框架提供的build函数内置基础组件和布局(容器)组件,构建自定义组件并展示在页面上。当然,我们也可以不使用容器组件,直接使用基础组件构建页面元素,但不推荐这种方式。组件过多无法有效控制布局。以下代码与示例具有相同的效果:@Entry@ComponentstructIndex{build(){Text('HelloWorld').fontSize(50).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center).width('100%').height('100%')//Flex({direction:FlexDirection.Column,alignItems:ItemAlign.Center,justifyContent:FlexAlign.Center}){//Text('HelloWorld')//.fontSize(50)//.fontWeight(FontWeight.Bold)//}//.width('100%')//.height('100%')}}为了满足UI界面复杂可控维护,我们必须对容器组件有一定的了解。在不同的场景下使用不同的容器组件,可以快速有效地构建出满足您需求的UI界面。接下来,使用Flex容器组件将标准计算器的三个块分开。2.1Flex容器组件Flex容器组件称为弹性布局组件。通过简单灵活的控制子组件和响应性,可以实现多种页面布局,因此Flex布局是首选布局。Flex容器组件具有以下特点:四种子组件布局模式:Row(行方向)、RowReverse(反转Row)、Column(列方向)、ColumnReverse(反转列)。容器元素的单行/多行显示:NoWrap(单行/列布局)、Wrap(多行/列布局)、WrapReverse(反转多行/列布局),都允许元素超出容器。两种对齐方式:主轴对齐和交叉轴对齐。只有当父组件是flex容器组件时,还可以设置子组件在主轴方向的基础尺寸(flexBasis)、子组件占容器剩余空间的比例(flexGrow)、压缩size分配给子组件(flexShrink),并设置子组件在容器中的横轴对齐(alignSelf)。@Entry@ComponentstructIndex{build(){flex({direction:FlexDirection.Column,alignItems:ItemAlign.Center,justifyContent:FlexAlign.Center}){Text('主轴线方向与布局方式一致').fontSize(9).fontColor('#CCCCCC').width('90%')//主轴与行方向一致为布局方式Flex({direction:FlexDirection.Row,wrap:FlexWrap.NoWrap,justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){Text('A').flexGrow(2).height(100).fontSize(50).backgroundColor('#F2F2F2').textAlign(TextAlign.Center)文本('B').flexGrow(1).height(100).fontSize(50).backgroundColor('#E2E2E2').textAlign(TextAlign.Center)}.width('100%').height(120).padding(10)Text('与Row方向相反的方向布局').fontSize(9).fontColor('#CCCCCC').width('90%')//与Row方向相反的方向布局弹性({方向:FlexDirection.RowReverse,换行:FlexWrap.NoWrap,justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){Text('A').flexGrow(2).height(100).fontSize(50).backgroundColor('#F2F2F2').textAlign(TextAlign.Center)Text('B').flexGrow(1).height(100).fontSize(50).backgroundColor('#E2E2E2').textAlign(TextAlign.Center)}.width('100%').height(120).padding(10)Text('Mainaxis与列方向一致为布局方式').fontSize(9).fontColor('#CCCCCC').width('90%')//主轴与列方向一致为布局方式Flex({direction:FlexDirection.Column,wrap:FlexWrap.NoWrap,justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){Text('A').flexGrow(2).width('100%').fontSize(50)).backgroundColor('#F2F2F2').textAlign(TextAlign.Center)文本('B').flexGrow(1).width('100%').fontSize(50).backgroundColor('#E2E2E2').textAlign(TextAlign.Center)}.width('100%').height(200).padding(10)Text('LayoutintheoppositedirectiontoColumn').fontSize(9).fontColor('#CCCCCC').宽度('90%')//与Column方向相反的布局Flex({direction:FlexDirection.ColumnReverse,wrap:FlexWrap.NoWrap,justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){Text('A').flexGrow(2).宽度('100%').fontSize(50).backgroundColor('#F2F2F2').textAlign(TextAlign.Center)Text('B').flexGrow(1).width('100%').fontSize(50).backgroundColor('#E2E2E2').textAlign(TextAlign.Center)}.width('100%').height(200).padding(10)}.width('100%').height('100%'')}}2.2标准计算器Flex布局实现通过flex容器布局构建页面。子组件主要由三个flex容器组件组成,分别占1、2、4,并使用不同的背景色进行简单的区域划分。代码如下:@Entry@ComponentstructIndex{build(){Flex({direction:FlexDirection.Column,alignItems:ItemAlign.Center,justifyContent:FlexAlign.Center}){//顶部功能按钮Flex({direction:FlexDirection.Row}){}.flexGrow(1).width('100%').backgroundColor('#F2F2F2')//回显和结果显示区域Flex({direction:FlexDirection.Column}){}.flexGrow(2).width('100%').backgroundColor('#FFFFFF')//功能按钮、符号按钮、数字按钮Flex({direction:FlexDirection.Column}){}.flexGrow(4).width('100%').backgroundColor('#E5E5E5')}.width('100%').height('100%').backgroundColor('#F5F5F5')}}总结这不是结束,而是开始需求开始写代码逐步实现;从设计图纸到代码实现;从技术点到代码实现。从学习到使用,从使用到学习,逐步掌握ArkUI框架的ets项目开发,下一篇将继续本文的内容。更多信息请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com