67.[HarmonyOS NEXT 实战案例八] 电影票务网格布局(上)

简介: 在移动应用开发中,电影票务应用是一个常见的场景,用户可以通过应用查看正在热映的电影信息,并进行选座购票等操作。本教程将详细讲解如何使用HarmonyOS NEXT的GridRow和GridCol组件实现电影票务应用中的电影列表网格布局,帮助开发者掌握网格布局的基本用法和实现技巧。

[HarmonyOS NEXT 实战案例八] 电影票务网格布局(上)

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

效果演示

img_aaee4058.png

1. 概述

在移动应用开发中,电影票务应用是一个常见的场景,用户可以通过应用查看正在热映的电影信息,并进行选座购票等操作。本教程将详细讲解如何使用HarmonyOS NEXT的GridRow和GridCol组件实现电影票务应用中的电影列表网格布局,帮助开发者掌握网格布局的基本用法和实现技巧。

本教程将涵盖以下内容:

  • 电影数据结构设计
  • 电影列表网格布局实现
  • GridRow和GridCol组件详解
  • 电影卡片UI设计与实现

2. 数据结构设计

在实现电影票务网格布局之前,我们需要先定义电影数据的结构。在本案例中,我们定义了一个MovieType接口,包含电影的基本信息:

interface MovieType {
   
    title: string;    // 电影标题
    rating: number;   // 电影评分
    poster: Resource; // 电影海报
    type: string;     // 电影类型
}

这个接口定义了电影的四个基本属性:

  • title:电影标题,字符串类型
  • rating:电影评分,数字类型
  • poster:电影海报,Resource类型(HarmonyOS中的资源引用类型)
  • type:电影类型,字符串类型(如科幻、动画、悬疑等)

3. 数据准备

定义好数据结构后,我们需要准备一些电影数据用于展示。在本案例中,我们在组件内部定义了一个电影数据数组:

private movies:MovieType[] = [
    {
    title: '流浪地球3', rating: 9.2, poster: $r("app.media.big7"), type: '科幻' },
    {
    title: '长安三万里', rating: 8.8, poster: $r("app.media.big5"), type: '动画' },
    {
    title: '消失的她', rating: 8.5, poster: $r("app.media.big1"), type: '悬疑' },
    {
    title: '封神第一部', rating: 8.9, poster: $r("app.media.big1"), type: '奇幻' }
]

这里我们准备了4部电影的数据,包括电影标题、评分、海报和类型。海报使用$r()方法引用应用资源。在实际应用中,这些数据通常会从服务器获取。

4. 布局实现

4.1 整体布局结构

电影票务网格布局的整体结构如下:

build() {
   
    Column() {
   
        Text('正在热映')
            .fontSize(20)
            .fontWeight(FontWeight.Bold)
            .margin({
    bottom: 16 })
            .width('100%')
            .textAlign(TextAlign.Start)

        GridRow({
    columns: 2, gutter: 16 }) {
   
            // 电影网格内容
        }
    }
    .width('100%')
    .padding(16)
}

整体布局使用一个Column容器,包含两个主要部分:

  1. 标题文本:显示"正在热映",使用Text组件实现
  2. 电影网格:使用GridRow和GridCol组件实现

4.2 GridRow和GridCol配置

在本案例中,我们使用GridRow和GridCol组件实现电影网格布局:

GridRow({
    columns: 2, gutter: 16 }) {
   
    ForEach(this.movies, (movie:MovieType) => {
   
        GridCol({
    span: 1 }) {
   
            // 电影卡片内容
        }
    })
}

GridRow组件的配置:

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

GridCol组件的配置:

  • span: 1:每个电影卡片占据1列的宽度

使用ForEach循环遍历电影数据数组,为每部电影创建一个GridCol网格项。

4.3 电影卡片实现

每个电影卡片的内部结构如下:

Column() {
   
    Image(movie.poster)
        .width('100%')
        .aspectRatio(0.7)
        .borderRadius(8)

    Text(movie.title)
        .fontSize(16)
        .fontWeight(FontWeight.Medium)
        .margin({
    top: 8 })
        .width('100%')
        .textAlign(TextAlign.Start)

    Row() {
   
        Text(movie.type)
            .fontSize(12)
            .fontColor('#9E9E9E')

        Row() {
   
            Image($r("app.media.heart_filled"))
                .width(12)
                .height(12)
                .margin({
    right: 4 })

            Text(movie.rating.toFixed(1))
                .fontSize(12)
        }
        .margin({
    left: 8 })
    }
    .width('100%')
    .margin({
    top: 4 })
    .justifyContent(FlexAlign.SpaceBetween)
}

电影卡片使用Column容器,包含三个主要部分:

  1. 电影海报:使用Image组件显示,设置宽度为100%,高宽比为0.7,圆角为8vp
  2. 电影标题:使用Text组件显示,字体大小为16fp,字体粗细为Medium,顶部外边距为8vp
  3. 电影信息行:使用Row容器,包含电影类型和评分两部分,两者之间使用SpaceBetween对齐方式

电影类型使用Text组件显示,字体大小为12fp,颜色为灰色(#9E9E9E)。

电影评分部分使用Row容器,包含一个心形图标和评分文本,评分文本使用toFixed(1)方法保留一位小数。

5. GridRow和GridCol组件详解

5.1 GridRow组件

GridRow是HarmonyOS NEXT提供的网格行容器组件,用于创建网格布局。它的主要属性包括:

属性名 类型 描述
columns number \ GridColumns 设置当前行列数
gutter Length \ GutterOption 设置列间距
breakpoints BreakPoints 设置断点值
direction GridRowDirection 设置布局方向,默认为GridRowDirection.Row

其中,GridColumns类型定义如下:

type GridColumns = {
   
  xs?: number; // 极小尺寸断点下的列数
  sm?: number; // 小尺寸断点下的列数
  md?: number; // 中尺寸断点下的列数
  lg?: number; // 大尺寸断点下的列数
  xl?: number; // 特大尺寸断点下的列数
  xxl?: number; // 超大尺寸断点下的列数
}

GutterOption类型定义如下:

type GutterOption = {
   
  x?: Length; // 横向间距
  y?: Length; // 纵向间距
}

5.2 GridCol组件

GridCol是HarmonyOS NEXT提供的网格列容器组件,用于在GridRow中创建网格项。它的主要属性包括:

属性名 类型 描述
span number \ GridColumnOption 设置当前组件跨越的列数
offset number \ GridColumnOption 设置当前组件的偏移列数
order number \ GridColumnOption 设置当前组件的顺序

其中,GridColumnOption类型定义如下:

type GridColumnOption = {
   
  xs?: number; // 极小尺寸断点下的值
  sm?: number; // 小尺寸断点下的值
  md?: number; // 中尺寸断点下的值
  lg?: number; // 大尺寸断点下的值
  xl?: number; // 特大尺寸断点下的值
  xxl?: number; // 超大尺寸断点下的值
}

6. 布局效果分析

本案例实现的电影票务网格布局效果如下:

  1. 整体采用2列网格布局,每个电影卡片占据1列
  2. 电影卡片包含海报、标题、类型和评分信息
  3. 海报使用aspectRatio属性保持固定的高宽比,确保所有海报显示一致
  4. 电影类型和评分信息使用justifyContent(FlexAlign.SpaceBetween)实现两端对齐

这种布局方式有以下优点:

  1. 结构清晰,信息展示完整
  2. 适合在不同尺寸的屏幕上显示
  3. 用户可以快速浏览多部电影的基本信息

7. 完整代码

以下是电影票务网格布局的完整代码:

// 电影票务网格布局
interface MovieType {
   
    title: string;
    rating: number;
    poster: Resource;
    type: string;
}
@Component
export struct MovieTicketGrid {
   
    private movies:MovieType[] = [
        {
    title: '流浪地球3', rating: 9.2, poster: $r("app.media.big7"), type: '科幻' },
        {
    title: '长安三万里', rating: 8.8, poster: $r("app.media.big5"), type: '动画' },
        {
    title: '消失的她', rating: 8.5, poster: $r("app.media.big1"), type: '悬疑' },
        {
    title: '封神第一部', rating: 8.9, poster: $r("app.media.big1"), type: '奇幻' }
    ]

    build() {
   
        Column() {
   
            Text('正在热映')
                .fontSize(20)
                .fontWeight(FontWeight.Bold)
                .margin({
    bottom: 16 })
                .width('100%')
                .textAlign(TextAlign.Start)

            GridRow({
    columns: 2, gutter: 16 }) {
   
                ForEach(this.movies, (movie:MovieType) => {
   
                    GridCol({
    span: 1 }) {
   
                        Column() {
   
                            Image(movie.poster)
                                .width('100%')
                                .aspectRatio(0.7)
                                .borderRadius(8)

                            Text(movie.title)
                                .fontSize(16)
                                .fontWeight(FontWeight.Medium)
                                .margin({
    top: 8 })
                                .width('100%')
                                .textAlign(TextAlign.Start)

                            Row() {
   
                                Text(movie.type)
                                    .fontSize(12)
                                    .fontColor('#9E9E9E')

                                Row() {
   
                                    Image($r("app.media.heart_filled"))
                                        .width(12)
                                        .height(12)
                                        .margin({
    right: 4 })

                                    Text(movie.rating.toFixed(1))
                                        .fontSize(12)
                                }
                                .margin({
    left: 8 })
                            }
                            .width('100%')
                            .margin({
    top: 4 })
                            .justifyContent(FlexAlign.SpaceBetween)
                        }
                    }
                })
            }
        }
        .width('100%')
        .padding(16)
    }
}

8. 总结

本教程详细讲解了如何使用HarmonyOS NEXT的GridRow和GridCol组件实现电影票务应用中的电影列表网格布局。通过本教程,你应该已经掌握了:

  1. 如何定义和准备电影数据
  2. 如何使用GridRow和GridCol组件创建网格布局
  3. 如何设计和实现电影卡片UI
  4. GridRow和GridCol组件的主要属性和用法

在下一篇教程中,我们将在此基础上进一步优化电影票务网格布局,添加更多功能和交互效果,如电影详情页、购票功能等。

相关文章
|
24天前
|
开发者 UED
HarmonyOS Next快速入门:通用属性
本教程以《HarmonyOS Next快速入门》为基础,涵盖应用开发核心技能。通过代码实例讲解尺寸、位置、布局约束、Flex布局、边框、背景及图像效果等属性设置方法。如`.width()`调整宽度,`.align()`设定对齐方式,`.border()`配置边框样式,以及模糊、阴影等视觉效果的实现。结合实际案例,帮助开发者掌握HarmonyOS组件属性的灵活运用,提升开发效率与用户体验。适合初学者及进阶开发者学习。
64 0
|
24天前
|
开发者
HarmonyOS Next快速入门:通用事件
本教程聚焦HarmonyOS应用开发,涵盖事件处理的核心内容。包括事件分发、触屏事件、键鼠事件、焦点事件及拖拽事件等。通过代码实例讲解点击事件、触控事件(Down/Move/Up)、获焦与失焦事件的处理逻辑,以及气泡弹窗的应用。适合开发者快速掌握HarmonyOS Next中通用事件的使用方法,提升应用交互体验。
63 0
|
24天前
|
开发者 容器
HarmonyOS Next快速入门:Button组件
本教程摘自《HarmonyOS Next快速入门》,聚焦HarmonyOS应用开发中的Button组件。Button支持胶囊、圆形和普通三种类型,可通过子组件实现复杂功能,如嵌入图片或文字。支持自定义样式(边框弧度、文本样式、背景色等)及点击事件处理。示例代码展示了不同类型按钮的创建与交互逻辑,助开发者快速上手。适合HarmonyOS初学者及对UI组件感兴趣的开发者学习。
68 0
|
29天前
|
开发者
鸿蒙开发:资讯项目实战之项目初始化搭建
目前来说,我们的资讯项目只是往前迈了很小的一步,仅仅实现了项目创建,步虽小,但概念性的知识很多,这也是这个项目的初衷,让大家不仅仅可以掌握日常的技术开发,也能让大家理解实际的项目开发知识。
鸿蒙开发:资讯项目实战之项目初始化搭建
|
23天前
|
缓存 JavaScript IDE
鸿蒙开发:基于最新API,如何实现组件化运行
手动只是让大家了解切换的原理,在实际开发中,可不推荐手动,下篇文章,我们将通过脚本或者插件,快速实现组件化模块之间的切换,实现独立运行,敬请期待!
鸿蒙开发:基于最新API,如何实现组件化运行
|
1月前
|
SQL 弹性计算 数据库
鸿蒙5开发宝藏案例分享---优化应用时延问题
鸿蒙性能优化指南来了!从UI渲染到数据库操作,6大实战案例助你提升应用流畅度。布局层级优化、数据加载并发、数据库查询提速、相机资源延迟释放、手势识别灵敏调整及转场动画精调,全面覆盖性能痛点。附赠性能自检清单,帮助开发者高效定位问题,让应用运行如飞!来自华为官方文档的精华内容,建议收藏并反复研读,共同探讨更多优化技巧。
|
1月前
|
缓存
鸿蒙5开发宝藏案例分享---Swiper组件性能优化实战
本文分享了鸿蒙系统中Swiper组件的性能优化技巧,包括:1) 使用`LazyForEach`替代`ForEach`实现懒加载,显著降低内存占用;2) 通过`cachedCount`精准控制缓存数量,平衡流畅度与内存消耗;3) 利用`onAnimationStart`在抛滑时提前加载资源,提升构建效率;4) 添加`@Reusable`装饰器复用组件实例,减少创建开销。实际应用后,图库页帧率从45fps提升至58fps,效果显著。适合处理复杂列表或轮播场景,欢迎交流经验!
|
1月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
1月前
|
数据库
鸿蒙5开发宝藏案例分享---跨线程性能优化指南
本文深入探讨鸿蒙系统跨线程序列化性能优化,借助DevEco Profiler工具定位序列化瓶颈。通过Sendable接口改造、数据瘦身等方法,将5万本书对象的序列化耗时从260ms+降至<8ms,甚至<1ms。总结避坑经验,建议常态化使用Profiler检测,避免传递大对象,提升多线程开发效率。
|
缓存 数据管理 Shell
鸿蒙5开发宝藏案例分享---性能分析简介
鸿蒙开发资源大揭秘!文中整理了HarmonyOS官方提供的100+场景化案例,涵盖性能优化、UI设计、设备适配等全链路内容。重点解析三大神级案例:折叠屏悬停交互、万人列表流畅滚动和服务卡片实时刷新,附带完整代码与避坑指南。通过精准搜索、代码移植和调试技巧,高效利用这些宝藏资源,助你省时省力避开开发陷阱。更有抖音级短视频流畅度优化方案等彩蛋等待探索!