的更多信息,请访问:https://harmonyos.51cto.comHarmonyos.51cto.com前言为了进一步开发OpenHarmony3.0内置应用,需要修改,本人需要掌握ArkUI声明式开发范式的相关知识。通过电竞快照应用实例,可以快速学习ArkUI的声明式开发,并拓展相关知识点的学习,最终实现对组件、布局、动效、数据状态管理的初步掌握,并安装最终的健康饮食应用到装有OpenHarmony3.0的Hi3516开发板上烧录。ArkUI是一个用于构建HarmonyOS应用程序界面的声明式UI开发框架。它使用极简的UI信息语法、丰富的UI组件、实时预览工具,助你将HarmonyOS应用界面开发效率提升30%。您只需使用一套TS/JSAPI,即可在多个鸿蒙设备上提供生动流畅的用户界面体验。——引自鸿蒙应用开发官网。准备DevEcoStudio3.0Beta1OpenHarmonySDK3.0。数据来自天行数据API。通过电竞快照应用学习ArkUI。创建电竞快照应用(OpenHarmony版)并配置OpenHarmonySDK。在左下角配置,选择设置,进入设置界面。在SDKManager菜单下选择OpenHarmonySDK,自定义存放路径,Platforms下勾选安装SDK,Tools下勾选Previewer和Toolchains。点击CreateProject创建项目,下拉到ChooseYourAbilityTemplate界面底部,选择【Standard】EmptyAbilitytemplate配置项目界面,完善项目信息Projectname:项目名称Projecttype:项目类型Bundlename:包名保存位置:项目保存地址Language:选择编程语言(eTS)CompatibleAPIversion:选择兼容版本(APIVersion7)Devicetype:Devicetype(Phone)点击Finish,等待工程构建完成。目录结构说明了app.ets全局应用程序逻辑和应用程序生命周期管理。pages存储所有组件页面。公共商店公共代码(可选)。resources存放资源配置文件。删除config.json文件中js->pages标签下的pages/second删除index.ets文件中的一些代码,如图:删除second.ets文件2.术语理解@Entry自定义组件用@修饰Entry作为页面默认的入口组件,当页面加载时,会先创建并渲染使用@Entry修饰的自定义组件。一个源文件中可以有多个自定义组件,但最多只能有一个自定义组件被@Entry修饰。认识@Component在声明式UI中,所有页面都是由组件组成的。@Component修饰的struct表示该结构具有组件化能力,可以成为一个独立的组件。这种类型的组件也称为自定义组件。构建函数build函数用于定义组件的声明式UI描述。认识@Builder@Builder装饰器定义了一种关于如何呈现自定义组件的方法。它可以在自定义组件内快速生成多个布局内容。例如,要在页面上显示多个名称,使用多个Text组件会使代码臃肿和冗余。使用@Builder定义一个public方法,在组件中引入。代码量小,实现复用。3.建立电竞新闻列表从图中可以看出,整个界面分为上下两部分,上半部分显示标题栏,下半部分显示电竞新闻列表。页面中使用的组件1)Column组件Column组件是一个容器组件,是一个垂直布局的容器。反之,有一个水平布局的容器,就是Row组件。我将这两个组件定位为线性布局容器。您可以使用alignItems属性来设置子组件在水平方向上的对齐方式。提供了三种对齐方式:开始、居中和结束。Column(){//subcomponent}.alignItems(Horizo??ntalAlign.Center)2)Flex组件Flex是一个弹性布局组件,它提供了五个属性来控制子组件的显示方式。Flex({direction:FlexDirection.Row,wrap:FlexWrap.NoWrap,justifyContent:FlexAlign.Start,alignItems:ItemAlign.Stretch,alginContent:FlexAlign.Start})direction:描述子组件在Flex容器上排列的方向,即就是主轴的方向,也就是子组件是水平排列还是垂直排列。FlexDirection.Row:水平排列(行方向),从行的起始位置开始。FlexDirection.RowReverse:水平排列(行方向),与Row方向相反,即从行尾开始排列。FlexDirection.Column:垂直排列(列方向),从列的起始位置开始。FlexDirection.ColumnReverse:垂直排列(列方向),与Column的方向相反,即从列的末端开始排列。Flex({direction:FlexDirection.Row}){}Flex({direction:FlexDirection.RowReverse}){}Flex({direction:FlexDirection.Column}){}Flex({direction:FlexDirection.ColumnReverse}){}包装:flex容器中的子组件是单行/列排列还是多行/列排列。justifyContent:子组件在flex容器主轴上的对齐格式。alignItems:子组件在flex容器横轴上的对齐格式。alignContent:当横轴有多余空间时,多行内容的对齐方式。仅当wrap为Wrap或WrapReverse时生效。3)List组件List组件用于显示一系列等宽的列表项,如显示新闻列表、商品列表等。List组件与ListItem组件配合使用。ListItem用于显示具体的数据项。List(){ListItem(){//组合数据项}ListItem(){//组合数据项}}4)文本组件Text用于呈现一条信息。Text(){}5)Image组件Image组件用于渲染和显示图片。Image(){}常用组件属性和事件width():设置组件本身的宽度。height():设置组件本身的高度。margin():设置边距属性。padding():设置填充属性。backgroundColor:设置组件的背景色。borderRadius:设置元素的边框半径。就像搭积木一样,将需要的部件拼装在一起,完成列表页的搭建。importrouterfrom'@system.router';import{ESports}from'../model/ESports.ets';import{initOnStartup}from'../model/ESportsList.ets';@ComponentstructESportsListItem{privateeSportsItem:ESportsbuild(){Flex({justifyContent:FlexAlign.Start,alignItems:ItemAlign.Center}){Image(this.eSportsItem.picUrl).objectFit(ImageFit.Contain).height('100%').width(120).margin({right:16,left:16})Column(){Text(this.eSportsItem.title).fontSize(14).fontWeight(FontWeight.Bold).maxLines(1).textOverflow({overflow:TextOverflow.Ellipsis})Text(this.eSportsItem.description).fontSize(12).fontColor('#cccccc').maxLines(2).textOverflow({overflow:TextOverflow.Ellipsis}).margin({top:10})}.padding(4)}.height(100).backgroundColor(0xF5F5F5).borderRadius(8)}}@Entry@ComponentstructIndex{privateeSportsItems:ESports[]=initOnStartup()build(){Column(){Flex({justifyContent:FlexAlign.Start,alignItems:ItemAlign.Center}){Text('电竞快览').fontSize(20).fontWeight(FontWeight.Bold).margin(20)}List({space:4,initialIndex:0}){ForEach(this.eSportsItems,item=>{ListItem(){ESportsListItem({eSportsItem:item})}.onClick(()=>{router.push({uri:'pages/content',params:{eSports:item}})})},item=>item.id.toString())}.width('96%')}.width("100%").height("100%").backgroundColor(0xE5E5E5).padding({top:5})}}4.构建电竞新闻内容importrouterfrom'@system.router';import{ESports}from'../model/ESports.ets';@ComponentstructPageTitle{privateeSports:ESports;build(){Flex({alignItems:ItemAlign.Start}){Image($r('app.media.back')).width(20).height('100%')Text(this.eSports.title).height('100%').fontSize(16)。fontWeight(FontWeight.Bold).maxLines(1).textOverflow({overflow:TextOverflow.Ellipsis}).margin({left:16})}.height(61).backgroundColor('#FFedf2f5').padding({top:13,bottom:14,left:12}).onClick(()=>{router.back();})}}@Entry@ComponentstructContent{privateeSports:ESports=router.getParams().eSports;build(){Column(){Stack({alignContent:Alignment.TopStart}){PageTitle({e运动:this.eSports})}Column(){Text(this.eSports.title).width('80%').fontSize(14).fontWeight(FontWeight.Bold).maxLines(2).textOverflow({overflow:TextOverflow.Ellipsis}).textAlign(TextAlign.Center).padding({top:8,bottom:8})Row({space:12}){Text(this.eSports.source).fontSize(12).fontColor('#CCCCCC')Text(this.eSports.ctime).fontSize(12).fontColor('#CCCCCC')}.margin({top:5,bottom:10})Text(this.eSports.description)。宽度('90%').height(80).lineHeight(20).fontSize(12).maxLines(5).textOverflow({overflow:TextOverflow.Ellipsis}).borderRadius(10).backgroundColor(0xE5E5E5).padding(10)}}.alignItems(Horizo??ntalAlign.Center).height('100%').width('100%')}}这里有个思考题:新闻内容用文本编辑器还是直接用URL怎么办链接地址可以直接显示在页面上吗?更多信息请访问:Harmonyos技术社区https://harmonyos.51cto.com与华为官方共建
