鸿蒙Harmony应用开发,数据驾驶舱页面的实现

先来看看我们要实现的驾驶舱的页面是什么样的

对于这种 响应式布局的页面构建,我们的脑子里面要有一个概念,就是"分而治之"。我们把这个页面进行分割,分割成不同的块然后再来逐个实现. 不难发现,我们可以将这个看到的效果简单的分割:1.首先在顶部有个banner轮播,我们称之为顶部区域。2.紧接着有个时间筛选的区域,这个筛选区域和上面的轮播有个层叠部分,筛选区域最下面有个5个TAB切换按钮.,3. 下面经营指标的展示。

所以我们可以用一个Column控件,分成head( ) ,option( ) ,biz( ) 三块来实现。由于整改页面的内容都比较长,所以在Column的外层在用一个Scroll组件来包裹。head( )和option( ) 之间的间隔可以用.margin({ top: -20 })来实现.

接下来我们来逐个讲述一下各个区域的实现:

  • head( )

head头部区域是一个轮播图,我们用一个Stack层叠布局作为根布局,然后我们有个蓝色的背景图,作为整个背景。在一个Banner控件作为页面的内容,Banner 中每个ITEM的 内容大概是 左边文字 中间图标 右边文字的组成形式

对此我们将Banner的ITEM封装成一个单独的组件 大题实现部分如下 :

export struct BannerItemView {// @Link model: BannerItemModel@Prop model: BannerItemModelbuild() {Stack({ alignContent: Alignment.Center }) {// 主要内容Row() {// 左侧文本Column() {Text(this.model.leftTile).fontColor(Color.White).fontSize(16)Text(`${this.model.leftValue}`).fontColor("#00d8fe").fontSize(24).fontWeight(FontWeight.Bold).margin({ top: 8 })Text('环比').fontColor(Color.White).fontSize(14).margin({ top: 8 })TriangleIcon({isUp: this.model.mQOQRate > 0,IconSize: 10}).margin({ top: 8 })Text(`${this.model.mQOQRate}%`).fontColor(Color.Red).fontSize(14).margin({ top: 8 })}.margin({ left: 15 }).alignItems(HorizontalAlign.Start)// 中间图片Image($r(this.model.mCenterImage)).objectFit(ImageFit.Contain).width(200).height(200)// 右侧文本Column() {Text('完成率').fontColor(Color.White).fontSize(16)Text(`${this.model.rightValue}%`).fontColor("#00d8fe").fontSize(24).fontWeight(FontWeight.Bold).margin({ top: 8 })Text('同比').fontColor(Color.White).fontSize(14).margin({ top: 8 })TriangleIcon({isUp: this.model.mYOYRate > 0,IconSize: 10}).margin({ top: 8 })Text(`${this.model.mYOYRate}%`).fontColor(Color.Red).fontSize(14).margin({ top: 8 })}.margin({ right: 15 }).alignItems(HorizontalAlign.End)}.width('100%').justifyContent(FlexAlign.SpaceBetween).alignItems(VerticalAlign.Center)}.width('100%').height('100%') // 可以根据需要调整高度}
}

Banner 组件鸿蒙官方也有,这边使用的是@abner/banner ,head的 大体实现如下

@Builder
header() {Stack({ alignContent: Alignment.Center }) {// 背景图Image($r('app.media.common_header_bg')).width('100%').height('100%').objectFit(ImageFit.Cover)Banner({data: this.bannerModel,itemPage: this.itemPage,indicator: new DotIndicator().itemWidth(8).itemHeight(8).selectedItemWidth(8).selectedItemHeight(8).color(Color.Gray).selectedColor(Color.White),indicatorType: IndicatorType.bottomCenter,isLoop: true,})// BannerItemView({ model: this.bannerModel[0] })}.width('100%').height(300)
}
  • option()

    现在我们对option区域进行庖丁解牛,可以看到页面在垂直方向 先是一个年月日切换的控件,中间区域是显示当前选定的时间,紧接着底部是指标的快速定位切换

    关于第一个日月的切换控件,我们可以 用一个ROW 组件 来包裹Text组件,然后对于每个Text都占据.layoutWeight(1)

    即可达到相应的效果,中间的时间选择同样的是一个Text显示开始日期中间显示"-",最后在显示一个结束日期即可

    最下面用一个TABS添加5个TabContent()即可

    Tabs({ barPosition: BarPosition.Start }) {TabContent().tabBar('经营').height(0)TabContent().tabBar('会员').height(0)TabContent().tabBar('直销').height(0)TabContent().tabBar("商企").height(0)TabContent().tabBar("品质").height(0)
    }
    

    所以整体的代码大概是这样:

    @Builder
    option() {Column() {Row() {ForEach(['日', '周', '月', '季', '年'], (range: string) => {Text(range).fontColor(this.currentTimeRange === range ? "#0000AA" : Color.Gray).fontSize(18).onClick(() => {this.currentTimeRange = rangeshowToast("当前点击" + range)}).layoutWeight(1)//.fontWeight(FontWeight.Bold).textAlign(TextAlign.Center)})}.backgroundColor("#f0f1f5").margin({ top: 20 }).width('90%').padding(10).borderRadius(10)Row() {Column() {Text('2024-01-01').fontSize(16).fontColor(Color.Black)}.backgroundColor("#f0f1f5").padding({left: 20,right: 20,top: 8,bottom: 8}).borderRadius(10).layoutWeight(1) //Text('-').fontSize(18).margin(10).fontColor('#0000AA')Column() {Text('2024-08-16').fontSize(16).fontColor(Color.Black)}.backgroundColor("#f0f1f5").padding({left: 20,right: 20,top: 8,bottom: 8}).borderRadius(10).layoutWeight(1) //}.backgroundColor(Color.White).margin({ top: 20 }).width('90%').justifyContent(FlexAlign.SpaceBetween).borderRadius(10)Tabs({ barPosition: BarPosition.Start }) {TabContent().tabBar('经营').height(0)TabContent().tabBar('会员').height(0)TabContent().tabBar('直销').height(0)TabContent().tabBar("商企").height(0)TabContent().tabBar("品质").height(0)}.height(50) // 设置 Tabs 的高度,只显示 tabBar}.width('100%').margin({ top: -20 }).borderRadius(28) // 添加这行来设置所有四个角的圆角为 8.backgroundColor(Color.White).height('auto') // 或者不设置 height
    }
    
    • biz()

      此处的biz的展示其实我之前就有写过2篇博客来介绍 控件的实现

      自定义View上下箭头

      自定义View 圆形进度条

      对于此处先是Column作为最外层,紧接着展示了经营指标说明,酒店的数据量,以及就是水平 展示各个指标名称数据,增加减少,对应的完成率。

      所以此处大体的代码如下:

      @Builder
      biz() {Column() {this.commonTitle("经营指标")HotelNumView({ model: this.total_model })CockpitProgressView({ model: $model1 }).padding({ left: 10 })CockpitProgressView({ model: $model2 }).padding({ left: 10 })CockpitProgressView({ model: $model3 }).padding({ left: 10 })HotelNumView({ model: this.middle_model })CockpitProgressView({ model: $model11 }).padding({ left: 10 })CockpitProgressView({ model: $model12 }).padding({ left: 10 })CockpitProgressView({ model: $model13 }).padding({ left: 10 })HotelNumView({ model: this.low_model })CockpitProgressView({ model: $model21 }).padding({ left: 10 })CockpitProgressView({ model: $model22 }).padding({ left: 10 })CockpitProgressView({ model: $model23 }).padding({ left: 10 })}.width('100%').margin({ top: 20 }).borderRadius({ topLeft: 28, topRight: 28 }).justifyContent(FlexAlign.Start) // 确保 Row 内的内容靠左对齐.alignItems(HorizontalAlign.Start).backgroundColor(Color.White).height('auto') // 或者不设置 height.padding({ bottom: 20 })
      }
      

我们可以看到 上述的 CockpitProgressView 中的model 都带了一个 " " 符号,因为我们这个数据是来自网络请求的,为了让父子组件之间能正常的传值,以及组件状态的刷新,我们边用 " "符号,因为我们这个数据是来自网络请求的,为了让父子组件之间能正常的传值,以及组件状态的刷新,我们边用 " "符号,因为我们这个数据是来自网络请求的,为了让父子组件之间能正常的传值,以及组件状态的刷新,我们边用""符号来设置我们的变量.

至此。我们的页面"小而全"的鸿蒙Harmony应用开发,数据驾驶舱的相关介绍已经完毕。大家可以下载相关代码进行研究!

完整项目下载地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/880073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

96. UE5 GAS RPG 实现闪电链技能(一)

闪电链有一个施法的过程,就是在按键按下的过程,会在按下的过程一直持续造成伤害,一直等到条件不满足(技能键位抬起,蓝量不足,被眩晕)时,将结束技能,并退出技能状态。 所以…

FreeRTOS学习——链表list

FreeRTOS学习——链表(列表)list,仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 参考大佬的好文章: freertos内核原理 Day1(链表) FreeRTOS-链表的源码解析 *list_t只能存储指向list_item_t的指针。每个list_item_t都…

VMware vCenter Server 7.0U3s 发布下载,新增功能概览

VMware vCenter Server 7.0U3s 下载 - 集中管理 vSphere 环境 Server Management Software | vCenter | 集中管理 vSphere 环境 请访问原文链接:https://sysin.org/blog/vmware-vcenter-7-u3/,查看最新版。原创作品,转载请保留出处。 作者…

YOLO交通目标识别数据集(红绿灯-汽车-自行车-卡车等)

YOLO交通目标识别 数据集 模型 ui界面 ✓图片数量15000,xml和txt标签都有; ✓class:biker,car,pedestrian,trafficLight,trafficLight-Green,trafficLight-GreenLeft, t…

2024年度国自然基金初审不受理的十大原因

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 2024年度基金申请已落下帷幕。近日,《中国科学基金》刊登了国自然基金委工作人员总结的2024年度国自然项目分析。一起来看下,为来年再战做准备。 …

【Docker】安装全流程与配置完整镜像源(可安装 nginx)

目录 一、卸载历史版本(选)二、配置 yum 源三、安装 docker四、配置 docker 镜像源加速(选、强烈建议)4.1 配置阿里镜像加速4.2 配置其他镜像源 五、启动 docker参考文章与视频 本文基于 Linux - CentOS 7 操作系统。 一、卸载历史…

面试真题:谈一谈Mysql的分库分表

分表和分库是什么?有什么区别? 分库是一种水平扩展数据库的技术,将数据根据一定规则划分到多个独立的数据库中。每个数据库只负责存储部分数据,实现了数据的拆分和分布式存储。分库主要是为了解决并发连接过多,单机 my…

【2024】前端学习笔记7-颜色-位置-字体设置

学习笔记 1.定义:css2.颜色:color3.字体相关属性:font3.1.字体大小:font-size3.2.字体风格:font - style3.3.字体粗细:font - weight3.4.字体族:font - family 4.位置:text-align 1.…

uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点

uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点 目录 介绍uniapp 介绍uniapp x 介绍功能框架图创建项目&发布组件/标签的变化js的变化css的变化工程结构和页面管理 pages.jsonmanifest.json 应用配置组件easycom组件规…

QT For Android开发-打开PPT文件

一、前言 需求: Qt开发Android程序过程中,点击按钮就打开一个PPT文件。 Qt在Windows上要打开PPT文件或者其他文件很容易。可以使用QDesktopServices打开文件,非常方便。QDesktopServices提供了静态接口调用系统级别的功能。 这里用的QDesk…

Isaac Sim 4.2.0 Windows版本打开报 fbgemm.dll 加载错误

方案一:下载缺少的dll复制到目录里即可 可以看到后台命令窗口出现了错误,发生在import pytorch的时候,根据提示,是因为fbgemm.dll缺少依赖,导致加载异常,一般情况是缺少 libomp140.x86_64.dll 这个文件&am…

【BEV 视图变换】Ray-based(2): 代码复现+画图解释 基于深度估计、bev_pool(代码一键运行)

paper:Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D code:https://github.com/nv-tlabs/lift-splat-shoot 一、完整复现代码(可一键运行)和效果图 import torch import torch.nn as nn import mat…

数模方法论-整数规划

一、基本概念 非线性规划的应用包括工程设计、资源分配、经济模型等。在求解过程中,由于非线性特性,常用的方法有梯度法、牛顿法、启发式算法等。求解非线性规划问题时,解的存在性和唯一性通常较难保证,且可能存在多个局部最优解…

《飞机大战游戏》实训项目(Java GUI实现)(设计模式)(简易)

目录 一、最终实现后,效果如下。 (1)简单介绍本游戏项目(待完善) (2)运行效果图(具体大家自己可以试) 初始运行情况。 手动更换背景图。 通过子弹攻击敌机,累…

Echats 实现CPK (过程能力)研究报告

背景: 实现: Echarts Option 代码示例 option {title: {text: 折线图示例 - X轴为数值},xAxis: {type: value, // X 轴改为数值型min: 0, // 最小值max: 10, // 最大值},yAxis: {type: value},series: [{type: line,data: [[0, 150], [2, 230], [4, 224], [6…

嵌入式单片机STM32开发板详细制作过程--01

大家好,今天主要给大家分享一下,单片机开发板的制作过程,原理图的制作与PCB设计,以及电子元器件采购与焊接。 第一:单片机开发板成品展示 板子正面都有各个芯片的丝印与标号,方便焊接元器件的时候,可以参考。(焊接完成之后,成品图如下) 第二:开发板原理图制作 在制…

FLStudio21Mac版flstudio v21.2.1.3430简体中文版下载(含Win/Mac)

给大家介绍了许多FL21版本,今天给大家介绍一款FL Studio21Mac版本,如果是Mac电脑的朋友请千万不要错过,当然我也不会忽略掉Win系统的FL,链接我会放在文章,供大家下载与分享,如果有其他问题,欢迎…

Spring后端直接用枚举类接收参数,自定义通用枚举类反序列化器

在使用枚举类做参数时,一般会让前端传数字,后端将数字转为枚举类,当枚举类很多时,很可能不知道这个code该对应哪个枚举类。能不能后端直接使用枚举类接收参数呢,可以,但是受限。 Spring反序列默认使用的是J…

投资学 01 定义,投资

02. 03. 3.1 直接投资:使用方和提供方是一个人

yolov8模型在Xray图像中关键点检测识别中的应用【代码+数据集+python环境+GUI系统】

yolov8模型在X yolov8模型在Xray图像中关键点检测识别中的应用【代码数据集python环境GUI系统】 1.背景意义 X射线是一种波长极短、穿透能力极强的电磁波。当X射线穿透物体时,不同密度和厚度的物质会吸收不同程度的X射线,从而在接收端产生不同强度的信号…