当前位置: 首页 > article >正文

HarmonyOS NEXT边学边玩:从零实现一个影视App(七、今日票房页面的设计与实现)

在本篇博客中,我们将介绍如何使用HarmonyOS NEXT框架从零开始构建一个简单的影视App,并重点实现“今日票房”页面的功能。我们将使用ArkUI组件库来搭建用户界面,并通过网络请求获取电影票房数据。

在这里插入图片描述
开源项目地址:https://atomgit.com/csdn-qq8864/hmmovie

项目准备

首先,我们需要创建一个新的HarmonyOS NEXT项目,并配置好必要的依赖。确保你已经安装了DevEco Studio,并创建了一个新的项目。

接口实现

在开始页面设计之前,我们需要先定义好获取电影票房数据的接口。我们使用axios来发送HTTP请求。在api文件夹下创建一个movie.js文件,编写获取电影票房数据的接口实现:

import {AxiosHttpRequest,HttpPromise} from '@nutpi/axios'
import {axiosClient,HttpPromise} from '../../utils/axiosClient';

// 电影票房接口
export const getPiaoMovie =  (): HttpPromise<PiaoFangResp> => axiosClient.get({url:'/piaomovie'});

这里定义了一个getPiaoMovie函数,用于发送GET请求获取电影票房数据。

数据模型定义

定义接口返回的数据模型,在bean文件夹下创建一个PiaoFangResp.js文件:

export interface PiaoFangRespData {
  name: string; // 影片名称
  release_date: string; // 上映日期
  box_million: number; // 综合票房(百万)
  share_box: number; // 票房占比
  row_films: number; // 排片占比
  row_seats: number; // 场均人次
}

export interface PiaoFangResp {
  data: {
    data: PiaoFangRespData[],
    message: string,
  };
}
页面设计与实现

接下来,我们将设计“今日票房”页面。页面的主要功能是展示今日票房最高的几部电影的相关信息,如影片名称、综合票房、票房占比、排片占比和场均人次。

我们创建一个名为TodayBoxOfficeView.ets的文件来实现这个页面:

import { Log } from "../../utils/logutil";
import { getPiaoMovie } from "../api/movie";
import { PiaoFangRespData } from "../bean/PiaoFangResp";
import { BusinessError } from "@kit.BasicServicesKit";

@Extend(Text)
function tableHeaderText() {
  .width('100%')
  .height('100%')
  .fontSize(12)
  .fontWeight(FontWeight.Bolder)
  .fontColor(Color.White)
  .textAlign(TextAlign.Center)
}

@Extend(Text)
function tableBodyText() {
  .width('100%')
  .height('100%')
  .fontSize(12)
  .fontColor(Color.White)
  .textAlign(TextAlign.Center)
}

@Component
export struct TodayBoxOfficeView {

  private todayBoxOfficeScroller: SwiperController = new SwiperController();
  @State todayBoxOfficeList: PiaoFangRespData[] = [];

  build() {
    Column() {
      Text('今日票房').fontSize(18).fontWeight(FontWeight.Bold).padding({ left:10,top:10,right:10 }).alignSelf(ItemAlign.Start)
      Column() {
        Swiper(this.todayBoxOfficeScroller) {
          ForEach(this.todayBoxOfficeList, (item: PiaoFangRespData) => {
            TodayBoxOfficeCard({ todayBoxOffice: item })
          })
        }
        .autoPlay(false)
        .indicator(true)
        .itemSpace(5)
        .indicator(
          Indicator.digit()
            .top(10)
            .left(8)
            .fontColor(Color.White)
            .selectedFontColor(Color.Brown)
            .digitFont({ size: 10, weight: FontWeight.Normal })
            .selectedDigitFont({ size: 14, weight: FontWeight.Bolder }))
      }
      .width('98%')
      .backgroundColor('rgba(55, 53, 67, 0.98)')
      .borderRadius(5)
    }
    .width('100%')
  }

  aboutToAppear(){
    getPiaoMovie().then((res) => {
      Log.debug(res.data.message);
      for (const itm of res.data.data) {
        this.todayBoxOfficeList.push(itm);
      }
    }).catch((err: BusinessError) => {
      Log.debug("request", "err.data.code:%d", err.code);
      Log.debug("request", err.message);
    });
  }
}

TodayBoxOfficeView结构中,我们使用Column布局来组织页面结构,Text组件来显示标题。Swiper组件用于展示票房列表,ForEach组件根据获取到的票房数据动态生成票房卡片。

定义单个票房卡片组件,TodayBoxOfficeCard结构用于展示单个电影的票房信息:

@Component
struct TodayBoxOfficeCard {
  @Prop todayBoxOffice: PiaoFangRespData;

  build() {
    Column() {
      GridRow({
        columns: 6
      }) {
        GridCol({ span: 2 }) {
          Text('影片名称')
            .tableHeaderText()
        }
        GridCol() {
          Text('综合票房')
            .tableHeaderText()
        }
        GridCol() {
          Text('票房占比')
            .tableHeaderText()
        }
        GridCol() {
          Text('排片占比')
            .tableHeaderText()
        }
        GridCol() {
          Text('场均人次')
            .tableHeaderText()
        }
      }
      .width('100%')
      .height(40)
      .backgroundColor('rgba(108, 106, 119, 0.98)')
      .borderRadius({ topLeft: 8, topRight: 8 })
      .padding({ left: 8, right: 8 })

      GridRow({
        columns: 6
      }) {
        GridCol({ span: 2 }) {
          Column({ space: 5 }) {
            Text(this.todayBoxOffice.name)
              .fontSize(12)
              .fontWeight(FontWeight.Bolder)
              .fontColor(Color.White)
            Text(this.todayBoxOffice.release_date)
              .fontSize(10)
              .fontColor(Color.Brown)
          }
          .width('100%')
          .height('100%')
          .justifyContent(FlexAlign.Center)
        }
        .width('100%')
        .height('100%')

        GridCol() {
          Text(this.todayBoxOffice.box_million)
            .tableBodyText()
            .fontColor(Color.Yellow)
        }
        .width('100%')
        .height('100%')

        GridCol() {
          Text(this.todayBoxOffice.share_box)
            .tableBodyText()
        }
        .width('100%')
        .height('100%')

        GridCol() {
          Text(this.todayBoxOffice.row_films)
            .tableBodyText()
        }
        .width('100%')
        .height('100%')

        GridCol() {
          Text(this.todayBoxOffice.row_seats)
            .tableBodyText()
        }
        .width('100%')
        .height('100%')
      }
      .width('100%')
      .height(64)
      .padding({ top: 16, left: 8, right: 8, bottom: 16 })
    }
    .width('100%')
  }
}

TodayBoxOfficeCard组件通过GridRowGridCol布局来展示每部电影的详细信息。我们定义了两个装饰器函数:tableHeaderTexttableBodyText,用于设置表头和表格内容的样式。

页面加载数据

TodayBoxOfficeView组件生命周期函数aboutToAppear中,我们调用getPiaoMovie接口获取电影票房数据,并将数据存储在todayBoxOfficeList状态变量中。todayBoxOfficeListPiaoFangRespData类型的数组,用于存储电影票房信息。

结语

通过本篇博客,我们介绍了如何在HarmonyOS NEXT中实现一个简单的“今日票房”页面。从接口定义到页面布局,我们展示了如何使用ArkUI组件库来构建用户界面,并通过网络请求动态加载数据。希望这篇博客能帮助你更好地理解HarmonyOS NEXT的开发流程。如果你有任何问题或建议,请随时留言交流。

作者介绍

作者:csdn猫哥

原文链接:https://blog.csdn.net/yyz_1987

团队介绍

坚果派团队由坚果等人创建,团队拥有12个华为HDE带领热爱HarmonyOS/OpenHarmony的开发者,以及若干其他领域的三十余位万粉博主运营。专注于分享HarmonyOS/OpenHarmony、ArkUI-X、元服务、仓颉等相关内容,团队成员聚集在北京、上海、南京、深圳、广州、宁夏等地,目前已开发鸿蒙原生应用和三方库60+,欢迎交流。

版权声明

本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。


http://www.kler.cn/a/517557.html

相关文章:

  • Vue 引入及简单示例
  • java后端之事务管理
  • 算法中的移动窗帘——C++滑动窗口算法详解
  • opengrok_使用技巧
  • 将 OneLake 数据索引到 Elasticsearch - 第二部分
  • 99.16 金融难点通俗解释:营业总收入
  • 结构生物学3-冷冻电镜单颗粒重构:
  • 【C++】异常与智能指针
  • 分组表格antd+ react +ts
  • Python数据分析-数据加载与存储(六)
  • .NET 9.0 的 Blazor Web App 项目、Bootstrap Blazor 组件库、自定义日志 TLog 使用备忘
  • 【开源实录】从App Store审核失败到开源:一个AI辅助开发的SwiftUI项目
  • Docker 在Linux 系统中的使用说明
  • 数据结构与算法再探(六)动态规划
  • AIP-128 声明友好接口
  • Java语言程序设计(第3版) 课后练习
  • 《jEasyUI 动态改变列》
  • 解决lombok注解失效
  • 鸿蒙(HarmonyOS) HDC 命令合集分类记录
  • UDP/TCP ③-拥塞控制 || 滑动窗口 || 流量控制 || 快速重传
  • FineBI数据连接失败
  • 提示词工程(Prompt Engineering)
  • Android多语言开发自动化生成工具
  • Unity3D仿星露谷物语开发25之创建时钟界面
  • 【Rust自学】14.6. 安装二进制crate
  • 「 机器人 」利用数据驱动模型替代仿真器:加速策略训练并降低硬件依赖