0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HarmonyOS开发案例:【 switch、chart组件的使用】

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-04-25 20:58 次阅读

介绍

基于switch组件和chart组件,实现线形图、占比图、柱状图,并通过switch切换chart组件数据的动静态显示。要求实现以下功能:

  1. 实现静态数据可视化图表。
  2. 打开开关,实现静态图切换为动态可视化图表。

相关概念

  • [switch组件]:开关选择器,通过开关,开启或关闭某个功能。
  • [chart组件]:图表组件,用于呈现线形图、占比图、柱状图界面。

环境搭建

软件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release及以上版本。
  • OpenHarmony SDK版本:API version 9及以上版本。

硬件要求

  • 开发板类型:[润和RK3568开发板]。
  • OpenHarmony系统:3.2 Release及以上版本。

环境搭建

完成本篇Codelab我们首先要完成开发环境的搭建,本示例以RK3568开发板为例,参照以下步骤进行:

  1. [获取OpenHarmony系统版本]:标准系统解决方案(二进制)。以3.2 Release版本为例:
  2. 搭建烧录环境。
    1. [完成DevEco Device Tool的安装]
    2. [完成RK3568开发板的烧录]
  3. 搭建开发环境。
    1. 开始前请参考[工具准备],完成DevEco Studio的安装和开发环境配置。
    2. 开发环境配置完成后,请参考[使用工程向导]创建工程(模板选择“Empty Ability”)。
    3. 工程创建完成后,选择使用[真机进行调测]。
    4. 鸿蒙开发指导文档:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

搜狗高速浏览器截图20240326151450.png

代码结构解读

本篇Codelab只对核心代码进行讲解,对于完整代码,我们会在gitee中提供。

HarmonyOS与OpenHarmony鸿蒙文档籽料:mau123789是v直接拿

├──entry/src/main/js	     // 代码区
│  └──MainAbility
│     ├──common
│     │  └──images           // 图片资源
│     ├──i18n                // 国际化中英文
│     │  ├──en-US.json			
│     │  └──zh-CN.json			
│     ├──pages
│     │  └──index
│     │     ├──index.css     // 首页样式文件	
│     │     ├──index.hml     // 首页布局文件
│     │     └──index.js      // 首页业务处理文件
│     └──app.js              // 程序入口
└──entry/src/main/resources  // 应用资源目录

构建主界面

本章节将介绍应用主页面的实现,页面从上至下分为两个部分:

  1. 使用switch组件实现切换按钮,用于控制chart组件数据的动静态显示。
  2. 使用chart组件依次实现线形图、占比图、柱状图。

本应用使用div组件用作外层容器,嵌套text、chart、switch等基础组件,共同呈现图文显示的效果。

< !-- index.hml -- >
< div class="container" >
    < !-- 自定义标题组件 -- >
    < div class="switch-block" >
        < text class="title" >Switch_Chart< /text >
        < text class="switch-info" >{{ $t('strings.switchInfo') }}< /text >
        < !-- switch按钮组件 -- >
        < switch onchange="change" >< /switch >
    < /div >
< /div >

在线形图中,lineOps用于设置线形图参数,包括曲线的样式、端点样式等。lineData 为线形图的数据。

< !-- index.hml -- >
< div class="container" >
    ....
    < !-- 线形图组件 -- >
    < div class="chart-block" >
        < stack class="stack-center" >
            < image class="background-image" src="common/images/bg_png_line.png" >< /image >
            < !-- 线形图 -- >
            < chart class="chart-data" type="line" ref="linechart" options="{{ lineOps }}" datasets="{{ lineData }}" >
            < /chart >
        < /stack >
        < !-- 线形图标题 -- >
        < text class="text-vertical" >{{ $t('strings.lineTitle') }}< /text >
    < /div >
< /div >

相对于线形图,占比图添加了自定义图例。其中rainBowData为占比图的数据。

< !-- index.hml -- >
< div class="container" >
    ....
    < !-- 占比图组件 -- >
    < div class="gauge-block" >
        < div class='flex-row-center full-size' >
            < stack class="flex-row-center rainbow-size" >
                < !-- 占比图组件 -- >
                < chart class="data-gauge" type="rainbow" segments="{{ rainBowData }}" effects="true"
                        animationduration="2000" >< /chart >
                ...
            < /stack >
            < div class='flex-column' >
                < !-- 自定义图例 -- >    
                < div class="chart-legend-item" >
                    < div class="chart-legend-icon rainbow-color-photo" >< /div >
                    < text class="chart-legend-text" >{{ this.$t('strings.legendPhoto') }} 64GB< /text >
                < /div >
                ....
            < /div >
        < /div >
        < !-- 占比图标题 -- >
        < text class="text-vertical" >{{ $t('strings.rainBowTitle') }}< /text >
    < /div >
< /div >

在柱状图中,barOps用于设置柱状图参数,barData为柱状图数据。

< !-- index.hml -- >
< div class="container" >
    < div class="bar-block" >
        < div class="flex-column full-size" >
            < !-- 自定义图例 -- >
            ...
            < stack class="full-size bar-height" >
                < image class="background-image" src="common/images/bg_png_bar.png" >< /image >
                < !-- 柱状图 -- >
                < chart class="data-bar" type="bar" id="bar-chart1" options="{{ barOps }}" datasets="{{ barData }}" >  
                < /chart >
            < /stack >
        < /div >
        < !-- 柱状图标题 -- >
        < text class="text-vertical" >{{ $t('strings.barTitle') }}< /text >
    < /div >
< /div >

动态显示数据

在上一章节讲解了switch组件实现切换按钮,接下来实现switch按钮的点击事件。在回调方法中设置chart组件静态或动态显示,静态时chart组件显示静态数据,动态时利用interval定时器动态生成并显示随机数据。

// index.js
export default {
  ...

  /**
   * switch按钮点击事件的回调方法
   */
  change(event) {
    if (event.checked) {
      // 线形图、柱状图数据定时器
      this.interval = setInterval(() = > {
        // 更新线形图数据
        this.changeLine();
        // 更新柱状图数据
        this.changeBar();
      }, 1000);
      // 占比图数据定时器
      this.rainbowInterval = setInterval(() = > {
        // 更新占比图数据
        this.changeGauge();
      }, 3000);
    } else {
      clearInterval(this.interval);
      clearInterval(this.rainbowInterval);
    }
  }
}

实现changeLine方法更新线形图数据。遍历所有数据,重新生成随机数并设置每个点的数据、形状、大小和颜色,最后为lineData重新赋值。

// index.js
export default {
  ...
  /**
   * 更新线形图数据
   */
  changeLine() {
    const dataArray = [];
    for (let i = 0; i < this.dataLength; i++) {
      const nowValue = Math.floor(Math.random() * CommonConstants.LINE_RANDOM_MAX + 1);
      const obj = {
        // y轴的值
        'value': nowValue,
        'pointStyle': {
          // 点的形状
          'shape': 'circle',
          'size': CommonConstants.LINE_POINT_SIZE,
          'fillColor': '#FFFFFF',
          'strokeColor': '#0A59F7'
        }
      };
      dataArray.push(obj);
    }
    this.lineData = [
      {
        // 曲线颜色
        strokeColor: '#0A59F7',
        // 渐变填充颜色
        fillColor: '#0A59F7', 
        data: dataArray,
        gradient: true
      }
    ];
  }
}

实现changeGauge方法更新占比图数据,每三秒增长5%的数据。

// index.js
export default {
  ...
  /**
   * 更新占比图数据
   */
  changeGauge() {
    const sysData = this.rainBowData[this.rainBowData.length - 2];
    sysData.value += addPercent;
    this.percent += addPercent;
    // 小数相加,保留一位小数
    this.used = (this.used * coefficients + addSize * coefficients) / coefficients;
    this.systemDataSize = (this.systemDataSize * coefficients + addSize * coefficients) / coefficients;
    // 数据总和到达100%后恢复初始数据
    if (sysData.value + CommonConstants.RAINBOW_OTHER_PERCENT > CommonConstants.RAINBOW_ALL_PERCENT) {
      sysData.value = CommonConstants.RAINBOW_SYSTEM_PERCENT;
      this.percent = CommonConstants.RAINBOW_USED_PERCENT;
      this.used = CommonConstants.RAINBOW_USED_SIZE;
      this.systemDataSize = CommonConstants.RAINBOW_SYSTEM_SIZE;
    }
    this.rainBowData = this.rainBowData.splice(0, this.rainBowData.length);
  },
}

实现changeBar方法更新柱状图数据。遍历柱状图所有的数据组,获取每组的数据后,再次遍历每组数据,生成随机数并为barData重新赋值。

// index.js
export default {
  ...
  /**
   * 更新柱状图数据
   */
  changeBar() {
    for (let i = 0; i < this.barGroup; i++) {
      const dataArray = this.barData[i].data;
      for (let j = 0; j < this.dataLength; j++) {
        dataArray[j] = Math.floor(Math.random() * CommonConstants.BAR_RANDOM_MAX + 1);
      }
    }
    this.barData = this.barData.splice(0, this.barGroup + 1);
  }
}

sf

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    57

    文章

    2307

    浏览量

    42737
  • HarmonyOS
    +关注

    关注

    79

    文章

    1967

    浏览量

    30009
  • OpenHarmony
    +关注

    关注

    25

    文章

    3658

    浏览量

    16136
收藏 人收藏

    评论

    相关推荐

    HarmonyOS开发案例:【 slider组件的使用】

    主要介绍slider滑动条组件的使用。如图所示拖动对应滑动条调节风车的旋转速度以及缩放比例。
    的头像 发表于 04-25 22:02 883次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>开发案</b>例:【 slider<b class='flag-5'>组件</b>的使用】

    HarmonyOS开发案例:【使用List组件实现商品列表】

    OpenHarmony ArkTS提供了丰富的接口和组件开发者可以根据实际场景和开发需求,选用不同的组件和接口。
    的头像 发表于 05-10 16:41 1263次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>开发案</b>例:【使用List<b class='flag-5'>组件</b>实现商品列表】

    HarmonyOS开发案例:【Web组件实现抽奖】

    基于ArkTS的声明式开发范式的样例,主要介绍了Web组件如何加载本地和云端H5小程序。
    的头像 发表于 05-09 18:31 1320次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>开发案</b>例:【Web<b class='flag-5'>组件</b>实现抽奖】

    HarmonyOS开发案例:【基础组件Slider的使用】

    学习如何使用声明式UI编程框架的基础组件。本篇Codelab将会使用Image组件、Slider组件、Text组件共同实现一个可调节的风车动画
    的头像 发表于 05-10 16:01 642次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>开发案</b>例:【基础<b class='flag-5'>组件</b>Slider的使用】

    HarmonyOS开发案例:【常用组件与布局】

    HarmonyOS ArkUI提供了丰富多样的UI组件,您可以使用这些组件轻松地编写出更加丰富、漂亮的界面。
    的头像 发表于 05-09 18:20 1166次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>开发案</b>例:【常用<b class='flag-5'>组件</b>与布局】

    HarmonyOS IoT 硬件开发案例分享

    ``许思维老师HiSpark Wi-Fi IoT 开发案例分享:案例一:AHT20温湿度传感器开发、调试;案例二:oled屏驱动库移植,调试;案例三:用OLED屏播放视频,Wi-Fi 和 TCP/IP 综合应用。 ``
    发表于 10-27 17:30

    【基于HarmonyOS开发购物应用】AnBetter Codelab第二期记录帖

    功能介绍使用UI组件开发出一个HarmonyOS购物应用。HarmonyOS开发者提供了多种组件
    发表于 04-17 00:55

    HarmonyOS应用开发资料(Svg组件

    1、HarmonyOS应用开发-Svg组件circle  该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。2、
    发表于 03-17 14:49

    组件资料】HarmonyOS三方件开发指南

    1、HarmonyOS三方件开发指南——LoadingView组件1.LoadingView组件功能介绍1.1.功能介绍:LoadingView组件
    发表于 03-21 11:18

    HarmonyOS应用开发-SwitchApplication体验

    一、组件说明使用了JS UI中的switchchart组件。 您可以通过切换switch开关设置cha
    发表于 08-19 14:52

    HarmonyOS实现静态与动态数据可视化图表

    一. 样例介绍 本篇Codelab基于switch组件chart组件,实现线形图、占比图、柱状图,并通过switch切换
    发表于 09-06 14:21

    HarmonyOS鸿蒙原生应用开发设计- 服务组件

    HarmonyOS设计文档中,为大家提供了一些已经设计好的原生服务组件库,开发者可以根据需要直接引用。 开发者直接使用官方提供的服务组件库样
    发表于 10-24 16:12

    华为开发HarmonyOS零基础入门:UI组件设计开发实践

    华为开发HarmonyOS零基础入门:UI组件设计开发实践之图库应用介绍,应用数据加载显示模型图片加载渲染功能快速在其他应用上。
    的头像 发表于 10-23 10:58 1633次阅读
    华为<b class='flag-5'>开发</b>者<b class='flag-5'>HarmonyOS</b>零基础入门:UI<b class='flag-5'>组件</b>设计<b class='flag-5'>开发</b>实践

    华为开发者分论坛HarmonyOS学生公开课-OpenHarmony Codelabs开发案

    2021华为开发者分论坛HarmonyOS学生公开课-OpenHarmony Codelabs开发案
    的头像 发表于 10-24 11:25 1884次阅读
    华为<b class='flag-5'>开发</b>者分论坛<b class='flag-5'>HarmonyOS</b>学生公开课-OpenHarmony Codelabs<b class='flag-5'>开发案</b>例

    如何开发一个helm chart

    使用helmfile时,我们首先得了解helm的使用,以及如何开发一个helm chart
    的头像 发表于 05-16 09:28 633次阅读