介绍
在接下来的两节中,我们将学习如何使用网格布局和列表布局展示赋能套件和本篇文档对应的教程内容。
在本节中,您将学习如何构建网格组件单个item视图。
以及如何构建列表组件单个item视图。
您可以选择从上一教程结束时构建完成的项目开始,也可以直接运行03_StartingPoint文件夹中的项目。
根据教程中的提示使用03_Resources文件夹中的文件。
如果您想要自行探索,可以直接打开03_Complete文件夹中的项目并浏览代码。
项目文件下载
下载项目文件并开始构建本项目。按照以下步骤操作
创建“赋能套件”网格视图Item
观察“赋能套件”网格视图,可以看到它由文章标题、文章简介和文章配图组成,我们将分别建立三个组件并将它们组合起来构建完整视图。
Step 1
在src/main/ets/pages目录下的Index.ets文件中,创建命名为EnablementItem的自定义组件,并用@Preview装饰器装饰,以便单独预览组件。
// src/main/ets/pages/Index.ets
@Entry
@Component
struct Index {
// ...
}
@Preview
@Component
struct EnablementItem {
build() {
}
}
No Preview
Step 2
将03_Resources文件夹中的“enablement_pic1.png”放置在entry/src/main/resources/base/media路径下。
Step 3
在组件中定义标题(title)和简介(brief)的类型都是string,赋值分别为“HarmonyOS第一课” 和 “基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验”。
在这里,定义它们为private类型,因为这两个值仅在本组件内做示例文本。
@Preview
@Component
struct EnablementItem {
private title: string = 'HarmonyOS第一课';
private brief: string = '基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。';
build() {
}
}
No Preview
当前教程为了方便教学,在代码中直接使用了变量对字符串进行了赋值。但是实际开发中,应该将资源文件,如字符串、图片、音频等统一存放于resources目录下,例如src/main/resources/base/element/string.json目录下存放string字符串。然后使用Resource资源引用类型, 通过 "$r('app.type.name')"的方式引用,具体可以参考:资源访问。
使用Resource资源便于后续使用和维护,比如多端适配和国际化。
Step 4
观察视图,Image组件和两个Text组件沿垂直方向布局,
我们用Column组件作为这个视图的最外层容器。在Column组件中添加Text组件和Image组件。
@Preview
@Component
struct EnablementItem {
private title: string = 'HarmonyOS第一课';
private brief: string = '基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。';
build() {
Column() {
Image('')
Text('')
Text('')
}
}
}
No Preview
使用$r的方式给Image组件设置图片资源,设置图片宽度为100%,即宽度与根容器Column保持一致。
设置填充效果为cover模式,即保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。
@Preview
@Component
struct EnablementItem {
private title: string = 'HarmonyOS第一课';
private brief: string = '基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。';
build() {
Column() {
Image($r('app.media.enablement_pic1'))
.width('100%')
.objectFit(ImageFit.Cover)
Text('')
Text('')
}
}
}
Preview
使用前面定义的变量title和brief,给Text组件设置文本信息,可以看到图片和文本按照垂直方向排列。
@Preview
@Component
struct EnablementItem {
private title: string = 'HarmonyOS第一课';
private brief: string = '基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。';
build() {
Column() {
Image($r('app.media.enablement_pic1'))
.width('100%')
.objectFit(ImageFit.Cover)
Text(this.title)
Text(this.brief)
}
}
}
Preview
Step 5
设置根组件宽度为160,高度为169,并设置组件四角的圆角值为16。
为整个组件添加白色背景(Color.White)。
@Preview
@Component
struct EnablementItem {
private title: string = 'HarmonyOS第一课';
private brief: string = '基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。';
build() {
Column() {
Image($r('app.media.enablement_pic1'))
.width('100%')
.objectFit(ImageFit.Cover)
Text(this.title)
Text(this.brief)
}
.width(160)
.height(169)
.borderRadius(16)
.backgroundColor(Color.White)
}
}
Preview
Step 6
设置图片高度为96,并设置图片左上角和右上角圆角值为16。这是由于图片填充效果为cover模式,对图片单独设置圆角以使之与父容器Column圆角一致。
@Preview
@Component
struct EnablementItem {
private title: string = 'HarmonyOS第一课';
private brief: string = '基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。';
build() {
Column() {
Image($r('app.media.enablement_pic1'))
.width('100%')
.objectFit(ImageFit.Cover)
.height(96)
.borderRadius({
topLeft: 16,
topRight: 16
})
Text(this.title)
Text(this.brief)
}
.width(160)
.height(169)
.borderRadius(16)
.backgroundColor(Color.White)
}
}
Preview
接下来给Text组件添加属性,textOverFlow属性设置文本超长时的显示方式,在这里我们设置它的值为Ellipsis,表示超长时使用省略号替代。
maxLines属性设置文本的最大行数,我们设置title最多显示一行,brief最多显示两行。
到这里我们完成了“赋能套件介绍”网格布局Item的创建。
@Preview
@Component
struct EnablementItem {
private title: string = 'HarmonyOS第一课';
private brief: string = '基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。';
build() {
Column() {
Image($r('app.media.enablement_pic1'))
.width('100%')
.objectFit(ImageFit.Cover)
.height(96)
.borderRadius({
topLeft: 16,
topRight: 16
})
Text(this.title)
.height(19)
.width('100%')
.fontSize(14)
.textAlign(TextAlign.Start)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.maxLines(1)
.fontWeight(400)
.padding({ left: 12, right: 12 })
.margin({ top: 8 })
Text(this.brief)
.height(32)
.width('100%')
.fontSize(12)
.textAlign(TextAlign.Start)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.maxLines(2)
.fontWeight(400)
.fontColor('rgba(0, 0, 0, 0.6)')
.padding({ left: 12, right: 12 })
.margin({ top: 2 })
}
.width(160)
.height(169)
.borderRadius(16)
.backgroundColor(Color.White)
}
}
Preview
创建“入门教程”列表视图Item
观察入门教程介绍视图,可以看到它同样由文章标题、文章简介和文章配图组成,但与赋能套件介绍的布局有所差异,我们将分别建立三个组件并将它们组合起来构建完整视图。
Step 1
在src/main/ets/pages目录下的Index.ets文件中,创建名为TutorialItem的自定义组件,并用@Preview装饰器装饰。同时注释掉前面创建的EnablementItem组件的@Preview注解,方便单独预览TutorialItem组件。
// @Preview
@Component
struct EnablementItem {
// ...
}
@Preview
@Component
struct TutorialItem {
build() {
}
}
No Preview
Step 2
在组件中定义标题(title)和简介(brief)。它们的类型都是string,赋值分别为“Step1 快速入门介绍” 和 “本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序 ”。
在这里,定义它们为private类型,因为这两个值仅在本组件内作示例文本。
@Preview
@Component
struct TutorialItem {
private title: string = 'Step1 快速入门介绍';
private brief: string = '本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序 。';
build() {
}
}
No Preview
Step 3
观察视图,布局整体为左右布局,左边为两个文本,这个两个文本沿垂直方向排列。
所以我们可以最外层使用Row容器,使文本和图片左右排列。左边文本可以使用Column容器垂直排列title和brief文本。
@Preview
@Component
struct TutorialItem {
private title: string = 'Step1 快速入门介绍';
private brief: string = '本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序 。';
build() {
Row() {
Column() {
Text('')
Text('')
}
Image('')
}
}
}
No Preview
使用$r的方式给Image组件设置图片资源,设置图片高度为64、宽度为108。
使用objectFit属性设置填充效果为cover模式,即保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。
@Preview
@Component
struct TutorialItem {
private title: string = 'Step1 快速入门介绍';
private brief: string = '本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序 。';
build() {
Row() {
Column() {
Text('')
Text('')
}
Image($r('app.media.enablement_pic1'))
.objectFit(ImageFit.Cover)
.height(64)
.width(108)
}
}
}
Preview
使用前面定义的变量title和brief,给Text组件设置文本信息,可以看到图片和文本按照垂直方向排列。
@Preview
@Component
struct TutorialItem {
private title: string = 'Step1 快速入门介绍';
private brief: string = '本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序 。';
build() {
Row() {
Column() {
Text(this.title)
Text(this.brief)
}
Image($r('app.media.enablement_pic1'))
.objectFit(ImageFit.Cover)
.height(64)
.width(108)
}
}
}
Preview
包裹文本的Column容器高度设为100%,设置layoutWeight属性,取值为1,表示它们在任意尺寸的设备下自适应占满剩余空间。
可以看到图片和文本按照垂直方向排列。
@Preview
@Component
struct TutorialItem {
private title: string = 'Step1 快速入门介绍';
private brief: string = '本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序 。';
build() {
Row() {
Column() {
Text(this.title)
Text(this.brief)
}
.height('100%')
.layoutWeight(1)
Image($r('app.media.enablement_pic1'))
.objectFit(ImageFit.Cover)
.height(64)
.width(108)
}
}
}
Preview
Step 4
设置Row容器宽度为“100%”,高度为88,并设置组件四角的圆角值为16。为整个组件添加白色背景(Color.White)。同时设置向内边距为12,内部容器顶端对齐。
@Preview
@Component
struct TutorialItem {
private title: string = 'Step1 快速入门介绍';
private brief: string = '本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序 。';
build() {
Row() {
Column() {
Text(this.title)
Text(this.brief)
}
.layoutWeight(1)
Image($r('app.media.enablement_pic1'))
.objectFit(ImageFit.Cover)
.height(64)
.width(108)
}
.width('100%')
.height(88)
.borderRadius(16)
.backgroundColor(Color.White)
.padding(12)
.alignItems(VerticalAlign.Top)
}
}
Preview
Step 5
设置图片圆角值为16。并设置Column容器alignItems属性为Start,表示内部子组件向左对齐,并设置右侧margin值为12,表示容器与Image组件相距12vp。
@Preview
@Component
struct TutorialItem {
private title: string = 'Step1 快速入门介绍';
private brief: string = '本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序 。';
build() {
Row() {
Column() {
Text(this.title)
Text(this.brief)
}
.height('100%')
.layoutWeight(1)
.alignItems(HorizontalAlign.Start)
.margin({ right: 12 })
Image($r('app.media.enablement_pic1'))
.objectFit(ImageFit.Cover)
.height(64)
.width(108)
.borderRadius(16)
}
.width('100%')
.height(88)
.borderRadius(16)
.backgroundColor(Color.White)
.padding(12)
.alignItems(VerticalAlign.Top)
}
}
Preview
Step 6
接下来给Text组件添加属性,在第二章节中我们已经对Text组件的一些属性进行了介绍,这里不再说明。
@Preview
@Component
struct TutorialItem {
private title: string = 'Step1 快速入门介绍';
private brief: string = '本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序 。';
build() {
Row() {
Column() {
Text(this.title)
.height(19)
.width('100%')
.fontSize(14)
.textAlign(TextAlign.Start)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.maxLines(1)
.fontWeight(400)
.margin({ top: 4 })
Text(this.brief)
.height(32)
.width('100%')
.fontSize(12)
.textAlign(TextAlign.Start)
.textOverflow({ overflow: TextOverflow.Ellipsis })
.maxLines(2)
.fontWeight(400)
.fontColor('rgba(0, 0, 0, 0.6)')
.margin({ top: 5 })
}
.height('100%')
.layoutWeight(1)
.alignItems(HorizontalAlign.Start)
.margin({ right: 12 })
Image($r('app.media.enablement_pic1'))
.objectFit(ImageFit.Cover)
.height(64)
.width(108)
.borderRadius(16)
}
.width('100%')
.height(88)
.borderRadius(16)
.backgroundColor(Color.White)
.padding(12)
.alignItems(VerticalAlign.Top)
}
}
Preview
至此,我们已经完成了“赋能套件”网格布局Item和“入门教程”列表布局Item的创建,下一节我们将介绍如何使用这两个Item构建列表。