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

news2024/9/19 13:09:01

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

对于这种 响应式布局的页面构建,我们的脑子里面要有一个概念,就是"分而治之"。我们把这个页面进行分割,分割成不同的块然后再来逐个实现. 不难发现,我们可以将这个看到的效果简单的分割: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: BannerItemModel

  build() {
    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 = range
                showToast("当前点击" + 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.coloradmin.cn/o/2146307.html

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

相关文章

ChartLlama: A Multimodal LLM for Chart Understanding and Generation论文阅读

原文链接:https://arxiv.org/abs/2311.16483 代码与数据集:https://tingxueronghua.github.io/ChartLlama/ 本文启发:文章提出利用GPT-4合成大量图表数据,这些数据包含各种图表类型,包含丰富的instruction data。然后…

Day04_JVM实战

文章目录 一、gc日志和dump快照GC日志是什么,要怎么看?dump快照是什么?要怎么看?二、gc日志和dump快照实战java.lang.OutOfMemoryError:Java heap space1、gc.log怎么看2、heapdump.hprof怎么看?①jvisualvm查看②使用MAT查看java.lang.OutOfMemoryError:Metaspace1、实时…

移动技术开发:登录注册界面

1 实验名称 登录注册界面 2 实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?><LinearLayoutxmlns:android"http://schemas.android.com/apk/…

游戏客服精华回复快捷语大全

以黑神话悟空为代表的国内的游戏行业&#xff0c;最近发展非常迅猛&#xff0c;大量游戏玩家需要足够的游戏客服支持&#xff0c;这里整理了游戏客服精华回复快捷语&#xff0c;涵盖了接待客户&#xff0c;游戏级数&#xff0c;游戏外挂&#xff0c;游戏要求&#xff0c;游戏特…

SAP SPROXY 配置

事务码SPROXY 然后找到目标的地址 然后创建新对象即可

【数据结构】排序算法---计数排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaGo 结语 1. 定义 计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。计数排序不是基于比较的排序算法&#xff0c;其核心在于将输入的数据值转化为键存储在额外开辟的数组…

AIGC时代!AI的“iPhone时刻”与投资机遇

AIGC时代&#xff01;AI的“iPhone时刻”与投资机遇 前言AI的“iPhone时刻”与投资机遇 前言 AIGC&#xff0c;也就是人工智能生成内容&#xff0c;它就像是一股汹涌的浪潮&#xff0c;席卷了整个科技世界。它的出现&#xff0c;让我们看到了人工智能的无限潜力&#xff0c;也…

从北大张泽民院士团队的研究成果中寻找医学AI未来的发展方向|个人观点·24-09-19

小罗碎碎念 如果有人问&#xff0c;“从你熟悉的院士中挑选一个&#xff0c;你最先想到的会是谁&#xff1f;“&#xff0c;我会毫不犹豫的回答&#xff1a;张泽民 昨晚一边在操场锻炼&#xff0c;一边在手机里听着一个哈佛的博士直播做报告。听报告的同时&#xff0c;脑子里在…

Android Studio报错: Could not find pub.devrel:easypermissions:0.3.0, 改用linux编译

在Android studio中去编译开源的仓库&#xff0c;大概率就是各种编译不过&#xff0c;一堆错误&#xff0c;一顿改错&#xff0c;基本上会耗费非常多时间&#xff0c;比如&#xff1a; 这个就是改gradle版本&#xff0c;改成7.2 &#xff0c;修改完成之后&#xff0c;还有其他报…

秋招面试注意了!网络安全工程师面试最怕遇到的问题,很多人都经历过!

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

培养关键职业技能,提升个人竞争力

文章目录 一、为什么要培养职业技能&#xff1f;1、提升个人竞争力2、提高工作效率和质量3、适应职业发展变化4、增加收入 二、关键职业技能概述1、专业技术能力2、问题解决能力3、沟通交流能力4、团队合作能力5、领导意识能力6、适应变化能力 三、结语 在当今快速发展的社会中…

react的组件的概念和使用

文章目录 1. **组件的定义****函数组件****类组件** 2. **组件的生命周期**3. **状态管理****类组件中的状态管理****函数组件中的状态管理** 4. **组件之间的通信****通过 Props 传递数据****上下文&#xff08;Context&#xff09;** 5. **组件的样式**6. **处理表单**7. **错…

[SAP ABAP] 修改内表数据

1.利用关键字修改数据 语法格式 MODIFY TABLE <itab> FTOM <wa> [TRANSPORTING f1 f2...].<itab>&#xff1a;代表内表 <wa>&#xff1a;代表工作区 示例1 内表修改前的数据 将上述数据行中的AGE字段值更改为25&#xff0c;SEX字段值更改为女 输出结…

基于windows下docker安装HDDM并运行

安装主要教程 如何安装HDDM(基于windows下 docker 和 linux) | 传鹏的实验室 (chuan-peng-lab.netlify.app) 安装时遇到的问题 1.下载完docker安装包&#xff0c;安装提示不适合本电脑 解决办法&#xff1a; 第一步&#xff1a;开启CPU虚拟化 Windows电脑如何开启CPU虚拟化…

JS全选反选案例

我们在进行网页制作的时候&#xff0c;通常会用到复选框&#xff0c;而复选框外面往往有一个大的勾选框来&#xff0c;控制里面的框是否全部选择&#xff0c;而里面的小复选框同时也是在控制着外面大的选择框&#xff0c;当里面全选的时候&#xff0c;外面的也会勾选上&#xf…

2018年国赛高教杯数学建模D题汽车总装线的配置问题解题全过程文档及程序

2018年国赛高教杯数学建模 D题 汽车总装线的配置问题 一&#xff0e;问题背景   某汽车公司生产多种型号的汽车&#xff0c;每种型号由品牌、配置、动力、驱动、颜色5种属性确定。品牌分为A1和A2两种&#xff0c;配置分为B1、B2、B3、B4、B5和B6六种&#xff0c;动力分为汽油…

自制数据库迁移工具-C版-04-HappySunshineV1.4-(支持Gbase8a、PG)

目录 一、环境信息 二、简述 三、架构图 四、升级点 五、支持功能 六、安装包下载地址 七、配置参数介绍 八、安装步骤 1、配置环境变量 2、生效环境变量 3、检验动态链接是否正常 4、修改配置文件MigrationConfig.txt &#xff08;1&#xff09;Gbase8a -> Gba…

机器学习模型中特征贡献度分析:预测贡献与错误贡献

在机器学习领域&#xff0c;特征重要性分析是一种广泛应用的模型解释工具。但是特征重要性并不等同于特征质量。本文将探讨特征重要性与特征有效性之间的关系&#xff0c;并引入两个关键概念&#xff1a;预测贡献度和错误贡献度。 核心概念 预测贡献度&#xff1a;衡量特征在…

【w0网页制作】Html+Css网页制作影视主题之庆余年Ⅱ含轮播表单(5页面附源码)

庆余年2HTMLCSS网页开发目录 &#x1f354;涉及知识&#x1f964;写在前面&#x1f367;一、网页主题&#x1f333;二、网页效果效果1、轮播效果图Page1、首页Page2、角色介绍Page3、剧情介绍Page4、剧集评价Page5、留言模块 &#x1f40b;三、网页架构与技术3.1 脑海构思3.2 整…

集装箱机房可视化:高效管理与监控

通过图扑可视化平台实时监控集装箱机房的运行状态和环境参数&#xff0c;优化资源配置&#xff0c;提升运维效率&#xff0c;确保数据中心安全可靠运行。