57.[HarmonyOS NEXT 实战案例三] 音乐专辑网格展示(上)

简介: HarmonyOS NEXT提供了强大的布局组件,其中GridRow和GridCol组件非常适合实现网格布局。在音乐应用中,专辑展示通常采用网格布局,以便用户可以直观地浏览各种音乐专辑。本教程将详细讲解如何使用GridRow和GridCol组件实现音乐专辑的网格展示布局。

[HarmonyOS NEXT 实战案例三] 音乐专辑网格展示(上)

项目已开源,开源地址: https://gitcode.com/nutpi/HarmonyosNextCaseStudyTutorial , 欢迎fork & star

效果演示

img_c06842f2.png

1. 概述

HarmonyOS NEXT提供了强大的布局组件,其中GridRow和GridCol组件非常适合实现网格布局。在音乐应用中,专辑展示通常采用网格布局,以便用户可以直观地浏览各种音乐专辑。本教程将详细讲解如何使用GridRow和GridCol组件实现音乐专辑的网格展示布局。

2. 数据结构设计

在实现音乐专辑网格展示之前,我们需要先定义专辑的数据结构。在本案例中,我们定义了一个Album接口,包含专辑名称、艺术家和封面图片:

interface Album {
   
    name: string;
    artist: string;
    cover: ResourceStr;
}

这个接口定义了专辑的基本属性:

  • name:专辑名称,字符串类型
  • artist:艺术家名称,字符串类型
  • cover:专辑封面图片资源,ResourceStr类型

3. 数据准备

在组件内部,我们准备了一个专辑数据数组,包含4个专辑信息:

private albums:Album[] = [
    {
    name: '流行热歌', artist: '多位艺人', cover: $r("app.media.big29") },
    {
    name: '古典精选', artist: '世界名曲', cover: $r("app.media.big28") },
    {
    name: '摇滚经典', artist: '传奇乐队', cover: $r("app.media.big25") },
    {
    name: '电子舞曲', artist: 'DJ合集', cover: $r("app.media.big23") }
]

这里使用了$r资源引用方式来引用应用资源目录下的图片资源。

4. 布局实现

4.1 整体布局结构

音乐专辑网格展示的整体结构如下:

Column() {
   
    Text('推荐歌单')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .margin({
    bottom: 16 })
        .width('100%')
        .textAlign(TextAlign.Start)

    GridRow({
    columns: 2, gutter: 16 }) {
   
        ForEach(this.albums, (album:Album) => {
   
            GridCol({
    span: 1 }) {
   
                // 专辑卡片内容
            }
        })
    }
}
.width('100%')
.padding(16)

整体布局使用了Column组件作为容器,内部包含一个标题文本和一个GridRow网格布局。最外层的Column设置了100%宽度和16的内边距。

4.2 标题实现

标题部分使用Text组件实现:

Text('推荐歌单')
    .fontSize(20)
    .fontWeight(FontWeight.Bold)
    .margin({
    bottom: 16 })
    .width('100%')
    .textAlign(TextAlign.Start)

标题设置了20的字体大小、粗体字重、16的底部边距、100%宽度和左对齐。

4.3 GridRow配置

GridRow组件的配置如下:

GridRow({
    columns: 2, gutter: 16 })

参数说明:

  • columns: 2:设置网格为2列布局
  • gutter: 16:设置网格项之间的间距为16vp

4.4 GridCol配置

GridCol组件的配置如下:

GridCol({
    span: 1 })

参数说明:

  • span: 1:设置该列占用1个网格单元

4.5 专辑卡片实现

每个专辑卡片的内部结构如下:

Column() {
   
    Image(album.cover)
        .width('100%')
        .aspectRatio(1)
        .borderRadius(8)

    Text(album.name)
        .fontSize(16)
        .margin({
    top: 8 })
        .width('100%')
        .textAlign(TextAlign.Start)

    Text(album.artist)
        .fontSize(12)
        .fontColor('#9E9E9E')
        .margin({
    top: 4 })
}

专辑卡片使用Column组件垂直排列以下元素:

  1. 专辑封面:使用Image组件,设置100%宽度、1:1的宽高比和8vp的圆角
  2. 专辑名称:使用Text组件,设置16的字体大小、8vp的上边距、100%宽度和左对齐
  3. 艺术家名称:使用Text组件,设置12的字体大小、灰色字体颜色和4vp的上边距

5. 布局效果分析

5.1 网格布局特点

本案例中的网格布局具有以下特点:

特点 描述
列数 2列
间距 16vp
内边距 16vp

5.2 专辑卡片特点

每个专辑卡片具有以下特点:

特点 描述
封面宽高比 1:1
封面圆角 8vp
专辑名称字体大小 16
专辑名称上边距 8vp
艺术家名称字体大小 12
艺术家名称字体颜色 #9E9E9E(灰色)
艺术家名称上边距 4vp

6. GridRow和GridCol组件详解

6.1 GridRow组件

GridRow组件是HarmonyOS NEXT中实现网格布局的容器组件,它将子组件按照网格进行排列。GridRow组件的主要属性如下:

属性名 类型 描述
columns number \ GridRowColumnOptions 设置布局列数
gutter Length \ GutterOption 设置列间距
breakpoints { value: Array, reference: BreakpointsReference } 设置断点响应参考值
direction GridRowDirection 设置布局方向

其中,GridRowColumnOptions类型可以设置不同断点下的列数,GutterOption类型可以设置水平和垂直方向的间距。

6.2 GridCol组件

GridCol组件用于定义网格中的列项,它必须作为GridRow的子组件使用。GridCol组件的主要属性如下:

属性名 类型 描述
span number \ GridColSpanOption 设置跨列数
offset number \ GridColOffsetOption 设置偏移列数
order number \ GridColOrderOption 设置显示顺序

其中,GridColSpanOption、GridColOffsetOption和GridColOrderOption类型可以设置不同断点下的跨列数、偏移列数和显示顺序。

7. 完整代码

以下是音乐专辑网格展示的完整代码:

interface Album {
   
    name: string;
    artist: string;
    cover: ResourceStr;
}

@Component
export struct MusicAlbumGrid {
   
    private albums:Album[] = [
        {
    name: '流行热歌', artist: '多位艺人', cover: $r("app.media.big29") },
        {
    name: '古典精选', artist: '世界名曲', cover: $r("app.media.big28") },
        {
    name: '摇滚经典', artist: '传奇乐队', cover: $r("app.media.big25") },
        {
    name: '电子舞曲', artist: 'DJ合集', cover: $r("app.media.big23") }
    ]

    build() {
   
        Column() {
   
            Text('推荐歌单')
                .fontSize(20)
                .fontWeight(FontWeight.Bold)
                .margin({
    bottom: 16 })
                .width('100%')
                .textAlign(TextAlign.Start)

            GridRow({
    columns: 2, gutter: 16 }) {
   
                ForEach(this.albums, (album:Album) => {
   
                    GridCol({
    span: 1 }) {
   
                        Column() {
   
                            Image(album.cover)
                                .width('100%')
                                .aspectRatio(1)
                                .borderRadius(8)

                            Text(album.name)
                                .fontSize(16)
                                .margin({
    top: 8 })
                                .width('100%')
                                .textAlign(TextAlign.Start)

                            Text(album.artist)
                                .fontSize(12)
                                .fontColor('#9E9E9E')
                                .margin({
    top: 4 })
                        }
                    }
                })
            }
        }
        .width('100%')
        .padding(16)
    }
}

8. 与其他布局方式的比较

8.1 GridRow vs Flex布局

HarmonyOS NEXT提供了多种布局方式,除了GridRow和GridCol组件,还有Flex布局(Row和Column组件)。下面是两者的比较:

特性 GridRow + GridCol Flex布局(Row/Column)
布局方式 网格布局 线性布局
响应式支持 原生支持断点响应 需要额外处理
间距设置 统一设置gutter 需要单独为每个子项设置margin
跨列能力 支持span属性设置跨列 不支持
偏移能力 支持offset属性设置偏移 不支持
排序能力 支持order属性设置顺序 不支持

8.2 适用场景

GridRow和GridCol组件适用于以下场景:

  • 需要实现网格布局的场景,如相册、商品列表等
  • 需要在不同屏幕尺寸下调整列数的响应式布局
  • 需要某些元素跨列或偏移的复杂布局

Flex布局(Row和Column组件)适用于以下场景:

  • 简单的线性布局,如水平或垂直排列的元素
  • 需要更灵活的对齐方式和空间分配
  • 不需要网格结构的布局

9. 总结

本教程详细讲解了如何使用HarmonyOS NEXT的GridRow和GridCol组件实现音乐专辑的网格展示布局。通过合理的数据结构设计和布局配置,我们实现了一个简洁、美观的音乐专辑展示页面。在下一篇教程中,我们将继续深入探讨如何优化这个布局,并添加更多交互功能。

相关文章
|
2月前
|
移动开发 前端开发 JavaScript
鸿蒙NEXT时代你所不知道的全平台跨端框架:CMP、Kuikly、Lynx、uni-app x等
本篇基于当前各大活跃的跨端框架的现状,对比当前它们的情况和未来的可能,帮助你在选择框架时更好理解它们的特点和差异。
193 0
|
12天前
|
移动开发 网络协议 小程序
鸿蒙NEXT即时通讯/IM系统RinbowTalk v2.4版发布,基于MobileIMSDK框架、ArkTS编写
RainbowTalk是一套基于开源即时通讯讯IM框架 MobileIMSDK 的产品级鸿蒙NEXT端IM系统。纯ArkTS编写、全新开发,没有套壳、也没走捷径,每一行代码都够“纯血”。与姊妹产品RainbowChat和RainbowChat-Web 技术同源,历经考验。
37 0
|
2月前
|
缓存 移动开发 网络协议
纯血鸿蒙NEXT即时通讯/IM系统:RinbowTalk正式发布,全源码、纯ArkTS编写
RainbowTalk是一套基于MobileIMSDK的产品级鸿蒙NEXT端IM系统,目前已正式发布。纯ArkTS、从零编写,无套壳、没走捷径,每一行代码都够“纯”(详见:《RainbowTalk详细介绍》)。 MobileIMSDK是一整套开源IM即时通讯框架,历经10年,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp、鸿蒙NEXT,服务端基于Netty编写。
138 1
|
编译器
鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(2/3)
本文介绍在三层架构中实现模块依赖的步骤。首先在产品定制层(features)的oh-package.json5文件中导入共享包依赖,如"basic":"file:../../commons/basic"。然后在产品层(products)的配置文件中同时导入公共能力层和产品定制层的依赖,示例展示了如何添加"basic"和"my"两个依赖项。通过这些配置,三层架构的各模块之间建立了完整的依赖关系。
121 0
鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(2/3)
|
3月前
|
开发者
鸿蒙开发:资讯项目实战之项目初始化搭建
目前来说,我们的资讯项目只是往前迈了很小的一步,仅仅实现了项目创建,步虽小,但概念性的知识很多,这也是这个项目的初衷,让大家不仅仅可以掌握日常的技术开发,也能让大家理解实际的项目开发知识。
鸿蒙开发:资讯项目实战之项目初始化搭建
|
3月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:外卖App
仓颉语言实战分享,教你如何用仓颉开发外卖App界面。内容包括页面布局、导航栏自定义、搜索框实现、列表模块构建等,附完整代码示例。轻松掌握Scroll、List等组件使用技巧,提升HarmonyOS应用开发能力。
|
3月前
|
缓存 JavaScript IDE
鸿蒙开发:基于最新API,如何实现组件化运行
手动只是让大家了解切换的原理,在实际开发中,可不推荐手动,下篇文章,我们将通过脚本或者插件,快速实现组件化模块之间的切换,实现独立运行,敬请期待!
111 0
鸿蒙开发:基于最新API,如何实现组件化运行
|
3月前
|
SQL 弹性计算 数据库
鸿蒙5开发宝藏案例分享---优化应用时延问题
鸿蒙性能优化指南来了!从UI渲染到数据库操作,6大实战案例助你提升应用流畅度。布局层级优化、数据加载并发、数据库查询提速、相机资源延迟释放、手势识别灵敏调整及转场动画精调,全面覆盖性能痛点。附赠性能自检清单,帮助开发者高效定位问题,让应用运行如飞!来自华为官方文档的精华内容,建议收藏并反复研读,共同探讨更多优化技巧。
|
3月前
|
存储 IDE 定位技术
【HarmonyOS 5】鸿蒙组件&模板服务详解 - 助力高效开发的利器
在移动应用开发领域,效率与质量始终是开发者追求的核心目标。鸿蒙系统作为新兴的操作系统,为开发者提供了丰富且强大的开发资源,其中鸿蒙组件&模板服务更是成为开发者快速构建高质量应用的得力助手。
120 0
|
3月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:健身App
本期分享一个健身App首页的布局实现,顶部采用Stack容器实现重叠背景与偏移效果,列表部分使用List结合Scroll实现可滚动内容。代码结构清晰,适合学习HarmonyOS布局技巧。