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


    一. 样例介绍

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

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

    相关概念

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

    完整示例

    gitee源码地址

    二.环境搭建

    我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。

    软件要求

    硬件要求

    • 设备类型:华为手机或运行在DevEco Studio上的华为手机设备模拟器。
    • HarmonyOS系统:3.1.0 Developer Release及以上版本。

    环境搭建

    1. 安装DevEco Studio,详情请参考下载和安装软件
    2. 设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
      1. 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境
    3. 开发者可以参考以下链接,完成设备调试的相关配置:

    三.代码结构解读

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

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

    四.构建主界面

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

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

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

    1. <div class="container">
    2. <div class="switch-block">
    3. <text class="title">Switch_Charttext>
    4. <text class="switch-info">{{ $t('strings.switchInfo') }}text>
    5. <switch onchange="change">switch>
    6. div>
    7. div>

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

    1. <div class="container">
    2. ....
    3. <div class="chart-block">
    4. <stack class="stack-center">
    5. <image class="background-image" src="common/images/bg_png_line.png">image>
    6. <chart class="chart-data" type="line" ref="linechart" options="{{ lineOps }}"
    7.               datasets="{{ lineData }}">
    8. chart>
    9. stack>
    10. <text class="text-vertical">{{ $t('strings.lineTitle') }}text>
    11. div>
    12. div>

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

    1. <!-- index.hml -->
    2. <div class="container">
    3. ....
    4. <!-- 占比图组件 -->
    5. <div class="gauge-block">
    6. <div class='flex-row-center full-size'>
    7. <stack class="flex-row-center rainbow-size">
    8. <!-- 占比图组件 -->
    9. <chart class="data-gauge" type="rainbow" segments="{{ rainBowData }}" effects="true"
    10.                         animationduration="2000"></chart>
    11. ...
    12. </stack>
    13. <div class='flex-column'>
    14. <!-- 自定义图例 -->
    15. <div class="chart-legend-item">
    16. <div class="chart-legend-icon rainbow-color-photo"></div>
    17. <text class="chart-legend-text">{{ this.$t('strings.legendPhoto') }} 64GB</text>
    18. </div>
    19. ....
    20. </div>
    21. </div>
    22. <!-- 占比图标题 -->
    23. <text class="text-vertical">{{ $t('strings.rainBowTitle') }}</text>
    24. </div>
    25. </div>

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

    1. <div class="container">
    2. <div class="bar-block">
    3. <div class="flex-column full-size">
    4. ...
    5. <stack class="full-size bar-height">
    6. <image class="background-image" src="common/images/bg_png_bar.png">image>
    7. <chart class="data-bar" type="bar" id="bar-chart1" options="{{ barOps }}" 
    8.                   datasets="{{ barData }}">
    9. chart>
    10. stack>
    11. div>
    12. <text class="text-vertical">{{ $t('strings.barTitle') }}text>
    13. div>
    14. div>

    五.动态显示数据

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

    1. // index.js
    2. export default {
    3.   ...
    4.   // switch按钮点击事件的回调方法
    5.   change(event) {
    6.     if (event.checked) {
    7.       // 线形图、柱状图数据定时器
    8.       this.interval = setInterval(() => {
    9.         // 更新线形图数据
    10.         this.changeLine(); 
    11.         // 更新柱状图数据
    12.         this.changeBar(); 
    13.       }, 1000);
    14. // 占比图数据定时器
    15.       this.rainbowInterval = setInterval(() => {
    16.         // 更新占比图数据
    17.         this.changeGauge(); 
    18.       }, 3000);
    19.     } else {
    20.       clearInterval(this.interval);
    21.       clearInterval(this.rainbowInterval);
    22.     }
    23.   }
    24. }

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

    1. // index.js
    2. export default {
    3.   ...
    4.   // 更新线形图数据
    5.   changeLine() {
    6.     const dataArray = [];
    7.     for (let i = 0; i < this.dataLength; i++) {
    8.       const nowValue = Math.floor(Math.random() * CommonConstants.LINE_RANDOM_MAX + 1);
    9.       const obj = {
    10.         // y轴的值
    11.         'value': nowValue,
    12.         'pointStyle': {
    13.           // 点的形状
    14.           'shape''circle',
    15.           'size': CommonConstants.LINE_POINT_SIZE,
    16.           'fillColor''#FFFFFF',
    17.           'strokeColor''#0A59F7'
    18.         }
    19.       };
    20.       dataArray.push(obj);
    21.     }
    22.     this.lineData = [
    23. {
    24.         // 曲线颜色
    25.         strokeColor: '#0A59F7',
    26.         // 渐变填充颜色
    27.         fillColor: '#0A59F7'
    28.         data: dataArray,
    29.         gradient: true
    30.       }
    31. ];
    32.   }
    33. }

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

    1. // index.js
    2. export default {
    3.   ...
    4.   // 更新线形图数据
    5.   changeLine() {
    6.     const dataArray = [];
    7.     for (let i = 0; i < this.dataLength; i++) {
    8.       const nowValue = Math.floor(Math.random() * CommonConstants.LINE_RANDOM_MAX + 1);
    9.       const obj = {
    10.         // y轴的值
    11.         'value': nowValue,
    12.         'pointStyle': {
    13.           // 点的形状
    14.           'shape''circle',
    15.           'size': CommonConstants.LINE_POINT_SIZE,
    16.           'fillColor''#FFFFFF',
    17.           'strokeColor''#0A59F7'
    18.         }
    19.       };
    20.       dataArray.push(obj);
    21.     }
    22.     this.lineData = [
    23. {
    24.         // 曲线颜色
    25.         strokeColor: '#0A59F7',
    26.         // 渐变填充颜色
    27.         fillColor: '#0A59F7'
    28.         data: dataArray,
    29.         gradient: true
    30.       }
    31. ];
    32.   }
    33. }

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

    1. // index.js
    2. export default {
    3.   ...
    4.   // 更新柱状图数据
    5.   changeBar() {
    6.     for (let i = 0; i < this.barGroup; i++) {
    7.       const dataArray = this.barData[i].data;
    8.       for (let j = 0; j < this.dataLength; j++) {
    9.         dataArray[j] = Math.floor(Math.random() * CommonConstants.BAR_RANDOM_MAX + 1);
    10.       }
    11.     }
    12.     this.barData = this.barData.splice(0, this.barGroup + 1);
    13.   }
    14. }

    六.总结

    您已经完成了本次Codelab的学习,并了解到以下知识点:

    1. switch、chart等组件的使用。

  • 相关阅读:
    ElasticSearch基本用法
    MySQL数据库基础知识要点总结
    GO微服务实战第十九节 如何保障分布式系统的高可用性?
    python多线程系列—线程池ThreadPoolExecutor(八)
    【转】常用的隧道技术
    C++ 邮件槽ShellCode跨进程传输
    【深度学习实验】卷积神经网络(八):使用深度残差神经网络ResNet完成图片多分类任务
    Netty服务端启动的整体流程-基于源码4.1.96Final分析
    iperf3: error - unable to connect to server: No route to host 但嵌入式Linux设备
    目标检测—Yolo系列(YOLOv1/2/v3/4/5/x/6/7/8)
  • 原文地址:https://blog.csdn.net/HarmonyOSDev/article/details/132709205