当前位置:   article > 正文

HarmonyOS实现静态与动态数据可视化图表_harmonyos制作饼图显示百分比

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. <!-- index.hml -->
  2. <div class="container">
  3. <!-- 自定义标题组件 -->
  4. <div class="switch-block">
  5. <text class="title">Switch_Chart</text>
  6. <text class="switch-info">{{ $t('strings.switchInfo') }}</text>
  7. <!-- switch按钮组件 -->
  8. <switch onchange="change"></switch>
  9. </div>
  10. </div>

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

  1. <!-- index.hml -->
  2. <div class="container">
  3. ....
  4. <!-- 线形图组件 -->
  5. <div class="chart-block">
  6. <stack class="stack-center">
  7. <image class="background-image" src="common/images/bg_png_line.png"></image>
  8. <!-- 线形图 -->
  9. <chart class="chart-data" type="line" ref="linechart" options="{{ lineOps }}"
  10.               datasets="{{ lineData }}">
  11. </chart>
  12. </stack>
  13. <!-- 线形图标题 -->
  14. <text class="text-vertical">{{ $t('strings.lineTitle') }}</text>
  15. </div>
  16. </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. <!-- index.hml -->
  2. <div class="container">
  3. <div class="bar-block">
  4. <div class="flex-column full-size">
  5. <!-- 自定义图例 -->
  6. ...
  7. <stack class="full-size bar-height">
  8. <image class="background-image" src="common/images/bg_png_bar.png"></image>
  9. <!-- 柱状图 -->
  10. <chart class="data-bar" type="bar" id="bar-chart1" options="{{ barOps }}" 
  11.                   datasets="{{ barData }}">
  12. </chart>
  13. </stack>
  14. </div>
  15. <!-- 柱状图标题 -->
  16. <text class="text-vertical">{{ $t('strings.barTitle') }}</text>
  17. </div>
  18. </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等组件的使用。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号