zl程序教程

您现在的位置是:首页 >  APP

当前栏目

通过电竞快览应用学ArkUI

2023-03-14 09:31:28 时间

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

前言

为了能够进一步对OpenHarmony3.0内置应用做修改,我需要先掌握ArkUI声明式开发范式的相关知识。通过电竞快览应用示例能够快速学习ArkUI声明式开发,并对相关知识点进行扩展学习,最终达到对组件、布局、动效和数据状态管理的初步掌握,并将最终的健康饮食应用程序安装到烧录了OpenHarmony3.0的Hi3516开发板上。

ArkUI是一套构建HarmonyOS应用界面的声明式UI开发框架。它使用极简的UI信息语法、丰富的UI组件、以及实时预览工具,帮助您提升HarmonyOS应用界面开发效率30%。您只需使用一套TS/JS API,就能在多个HarmonyOS设备上提供生动而流出的用户界面体验。 ——引自HarmonyOS应用开发官网

准备

  1. DevEco Studio 3.0 Beta1
  2. OpenHarmony SDK 3.0
  3. 数据来源于天行数据API

通过电竞快览应用学ArkUI

1. 创建电竞快览应用(OpenHarmony版)

配置OpenHarmony SDK

打开DevEco Studio,点击左下角Configure,选择Setting进入设置界面。在SDK Manager菜单下选择OpenHarmony SDK,自定义存放路径,并勾选安装Platforms下的SDK及Tools下的Previewer和Toolchains。

【图尔科技(宁)】电竞快览(ArkUI版)-鸿蒙HarmonyOS技术社区
【图尔科技(宁)】电竞快览(ArkUI版)-鸿蒙HarmonyOS技术社区

点击Create Project创建项目

在Choose Your Ability Template界面下拉到最底部,选择[Standard]Empty Ability模板

【图尔科技(宁)】电竞快览(ArkUI版)-鸿蒙HarmonyOS技术社区

配置工程界面完善项目信息

【图尔科技(宁)】电竞快览(ArkUI版)-鸿蒙HarmonyOS技术社区

Project name:项目名称

Project type:项目类型

Bundle name:包名称

Save location:项目保存地址

Language:选择编程语言(eTS)

Compatible API version:选择兼容版本(API Version 7)

Device type:设备类型(Phone)

点击Finish,等待项目构建完成。

目录结构说明

【图尔科技(宁)】电竞快览(ArkUI版)-鸿蒙HarmonyOS技术社区

app.ets 全局应用逻辑和应用生命周期管理。

pages 存放所有组件页面。

common 存放公共代码(可选)。

resources 存放资源配置文件。

删除config.json文件中js -> pages标签下的pages/second

删除index.ets文件中的一些代码,如图所示:

【图尔科技(宁)】电竞快览(ArkUI版)-鸿蒙HarmonyOS技术社区

删除second.ets文件

2. 术语

认识@Entry

用@Entry装饰的自定义组件用作页面的默认入口组件,加载页面时,将首先创建并呈现@Entry装饰的自定义组件。单个源文件中,可以存在多个自定义组件,但最多可以使用@Entry装饰一个自定义组件。

认识@Component

在声明式UI中,所有的页面都是由组件构成。使用@Component装饰的struct表示该结构体具有组件化能力,能够成为一个独立的组件,这种类型的组件也称为自定义组件。

build函数

build函数用于定义组件的声明式UI描述。

认识@Builder

@Builder装饰器定义了一个如何渲染自定义组件的方法。通过其可以在一个自定义组件内快速生成多个布局内容。比如要在一个页面显示多个名称,使用多个Text组件显得代码臃肿且冗余,使用@Builder定义一个公用的方法,在组件中引入,代码量少且达到了复用。

3. 构建电竞新闻列表

【图尔科技(宁)】电竞快览(ArkUI版)-鸿蒙HarmonyOS技术社区

由图可知,整个界面分为上下两部分,上部分显示标题栏,下部分显示电竞新闻列表。

页面中使用的组件

1)Column组件

Column组件是容器组件,是沿垂直方向布局的容器。相对的就存在沿水平方向布局的容器,其为Row组件,这两个组件我将它们定位为线性布局容器。

可以通过alignItems属性来设置子组件在水平方向上的对齐格式。提供了Start、Center、End三种对齐方式。

  1. Column() { 
  2.     //子组件 
  3. .alignItems(HorizontalAlign.Center) 

 2)Flex组件

Flex是弹性布局组件,其提供五个属性来控制子组件的显示方式。

  1. 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方向相反,即从列尾开始排列。

  1. Flex({direction: FlexDirection.Row}) {} 
  2. Flex({direction: FlexDirection.RowReverse}) {} 
  3. Flex({direction: FlexDirection.Column}) {} 
  4. Flex({direction: FlexDirection.ColumnReverse}) {} 
【图尔科技(宁)】电竞快览(ArkUI版)-鸿蒙HarmonyOS技术社区

wrap: Flex容器中子组件是单行/列还是多行/列排列。

justifyContent:子组件在Flex容器主轴上的对齐格式。

alignItems:子组件在Flex容器交叉轴上的对齐格式。

alignContent:交叉轴中有额外的空间时,多行内容的对齐方式。仅在wrap为Wrap或WrapReverse下生效。

3)List组件

List组件用于显示一系列相同宽度的列表项,比如显示新闻列表、商品列表等。List组件和ListItem组件一起使用。ListItem用于展示具体的数据项。

  1. List() { 
  2.     ListItem() { 
  3.       //组合数据项 
  4.     } 
  5.     ListItem() { 
  6.       //组合数据项 
  7.     } 

 4)Text组件

Text用于呈现一段信息。

  1. Text(){} 

 5)Image组件

Image组件用于渲染展示图片。

  1. Image(){} 

通用组件属性和事件

width():设置组件自身的宽度。

height():设置组件自身的高度。

margin():设置外边距属性。

padding():设置内边距属性。

backgroundColor:设置组件的背景色。

borderRadius:设置元素的边框圆角半径。

和搭积木一样,把需要的组件组装到一起,完成列表页的构建。

  1. import router from '@system.router'
  2. import {ESports} from '../model/ESports.ets'
  3. import {initOnStartup} from '../model/ESportsList.ets'
  4.  
  5.  
  6. @Component 
  7. struct ESportsListItem { 
  8.   private eSportsItem: ESports 
  9.   build() { 
  10.     Flex({justifyContent:FlexAlign.Start, alignItems: ItemAlign.Center}) { 
  11.       Image(this.eSportsItem.picUrl) 
  12.         .objectFit(ImageFit.Contain) 
  13.         .height('100%'
  14.         .width(120) 
  15.         .margin({right: 16, left: 16}) 
  16.       Column() { 
  17.         Text(this.eSportsItem.title) 
  18.           .fontSize(14) 
  19.           .fontWeight(FontWeight.Bold) 
  20.           .maxLines(1) 
  21.           .textOverflow({overflow: TextOverflow.Ellipsis}) 
  22.         Text(this.eSportsItem.description) 
  23.           .fontSize(12) 
  24.           .fontColor('#cccccc'
  25.           .maxLines(2) 
  26.           .textOverflow({overflow: TextOverflow.Ellipsis}) 
  27.           .margin({top: 10}) 
  28.       } 
  29.       .padding(4) 
  30.     } 
  31.     .height(100) 
  32.     .backgroundColor(0xF5F5F5) 
  33.     .borderRadius(8) 
  34.   } 
  35.  
  36. @Entry 
  37. @Component 
  38. struct Index { 
  39.   private eSportsItems: ESports[] = initOnStartup() 
  40.   build() { 
  41.     Column() { 
  42.       Flex({justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center}) { 
  43.         Text('电竞快览'
  44.           .fontSize(20) 
  45.           .fontWeight(FontWeight.Bold) 
  46.           .margin(20) 
  47.       } 
  48.       List({space: 4, initialIndex: 0}) { 
  49.         ForEach(this.eSportsItems, item => { 
  50.           ListItem() { 
  51.             ESportsListItem({eSportsItem: item}) 
  52.           } 
  53.           .onClick(() => { 
  54.             router.push({ 
  55.               uri: 'pages/content'
  56.               params: {eSports: item} 
  57.             }) 
  58.           }) 
  59.         }, item => item.id.toString()) 
  60.       } 
  61.       .width('96%'
  62.     } 
  63.     .width("100%"
  64.     .height("100%"
  65.     .backgroundColor(0xE5E5E5) 
  66.     .padding({top: 5}) 
  67.   } 

4. 构建电竞新闻内容

【图尔科技(宁)】电竞快览(ArkUI版)-鸿蒙HarmonyOS技术社区
  1. import router from '@system.router'
  2. import {ESports} from '../model/ESports.ets'
  3.  
  4.  
  5. @Component 
  6. struct PageTitle { 
  7.   private eSports: ESports; 
  8.   build() { 
  9.     Flex({alignItems: ItemAlign.Start}) { 
  10.       Image($r('app.media.back')) 
  11.         .width(20) 
  12.         .height('100%'
  13.       Text(this.eSports.title) 
  14.         .height('100%'
  15.         .fontSize(16) 
  16.         .fontWeight(FontWeight.Bold) 
  17.         .maxLines(1) 
  18.         .textOverflow({overflow: TextOverflow.Ellipsis}) 
  19.         .margin({left: 16}) 
  20.     } 
  21.     .height(61) 
  22.     .backgroundColor('#FFedf2f5'
  23.     .padding({top: 13, bottom: 14, left: 12}) 
  24.     .onClick(() => { 
  25.       router.back(); 
  26.     }) 
  27.   } 
  28.  
  29.  
  30. @Entry 
  31. @Component 
  32. struct Content { 
  33.   private eSports: ESports = router.getParams().eSports; 
  34.   build() { 
  35.     Column() { 
  36.       Stack({alignContent: Alignment.TopStart}) { 
  37.         PageTitle({eSports: this.eSports}) 
  38.       } 
  39.       Column() { 
  40.         Text(this.eSports.title) 
  41.           .width('80%'
  42.           .fontSize(14) 
  43.           .fontWeight(FontWeight.Bold) 
  44.           .maxLines(2) 
  45.           .textOverflow({overflow: TextOverflow.Ellipsis}) 
  46.           .textAlign(TextAlign.Center) 
  47.           .padding({top: 8, bottom: 8}) 
  48.         Row({space: 12}) { 
  49.           Text(this.eSports.source) 
  50.             .fontSize(12) 
  51.             .fontColor('#CCCCCC'
  52.           Text(this.eSports.ctime) 
  53.             .fontSize(12) 
  54.             .fontColor('#CCCCCC'
  55.         } 
  56.         .margin({top: 5, bottom: 10}) 
  57.         Text(this.eSports.description) 
  58.           .width('90%'
  59.           .height(80) 
  60.           .lineHeight(20) 
  61.           .fontSize(12) 
  62.           .maxLines(5) 
  63.           .textOverflow({overflow: TextOverflow.Ellipsis}) 
  64.           .borderRadius(10) 
  65.           .backgroundColor(0xE5E5E5) 
  66.           .padding(10) 
  67.  
  68.       } 
  69.     } 
  70.     .alignItems(HorizontalAlign.Center) 
  71.     .height('100%'
  72.     .width('100%'
  73.   } 

这里预留一个思考题:

新闻内容是使用文本编辑器或者直接使用的是URL链接地址,如何让它能够在页面中直接显示?

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com