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

news/2024/9/19 0:00:09 标签: harmonyos, 华为

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

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

相关文章

Vue学习记录之四(computed的用法)

computed 属性用于创建计算属性。计算属性是基于现有响应式数据派生出的值,它会自动缓存,只有当依赖的响应式数据发生变化时,计算属性才会重新计算,这样可以提高性能和避免不必要的重复计算。 书写有两种方法: 1、选项…

文件操作

1.文件的打开和关闭 文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。 在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。ANSI C规定使用fopen函数来打开文…

【python】30、矩阵加法 tensor.sum

文章目录 一、tensor.sum 一、tensor.sum 为了更好地理解 torch.sum 函数中 dim 参数的作用,我们可以将三维张量的求和过程分解,并通过具体的例子来说明不同 dim 参数的效果。### 三维张量的结构假设我们有一个 3x2x2 的张量,如下所示&#…

【JavaEE初阶】多线程6(线程池\定时器)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 实例3:线程池 参数解释 核心线程数, 最大线程数 允许空闲的最大时间 ,时间单位 任务队列(阻塞队列) 线程工厂>工厂设计模式 拒绝策略 使用举例 模拟实现一个线…

windows使用tcpdump.exe工具进行抓包教程

windows主机安装一些抓包工具可能有些不方便,这里有一个tcpdump.exe工具直接免安装,可以直接使用进行抓包。(工具下载见 附件) tcpdump.exe使用教程 如下: 1:tcpdump -D 可查看网络适配器(注意前面的编号)…

OpenHarmony(鸿蒙南向开发)——轻量和小型系统三方库移植指南(一)

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植指南(一) Op…

Web植物管理系统-下位机部分

本节主要展示上位机部分,采用BSP编程,不附带BSP中各个头文件的说明,仅仅是对main逻辑进行解释 main.c 上下位机通信 通过串口通信,有两位数据验证头(verify数组中保存对应的数据头 0xAA55) 通信格式 上位发送11字节…

Python那些关于字符串的操作

Python那些关于字符串的操作 1 前言2 字符串的处理操作.2.1分割字符串2.2拼接字符串2.3正则表达式2.4enumerate2.5字符串中的大小写转化2.6 对齐加数 总结 1 前言 python关于字符串的操作很多,而正则化直接是打开新世界的大门。同一种说法,使用不同语言…