关于harmonyos:HarmonyOS实现静态与动态数据可视化图表

88次阅读

共计 4794 个字符,预计需要花费 12 分钟才能阅读完成。

一. 样例介绍

本篇 Codelab 基于 switch 组件和 chart 组件,实现线形图、占比图、柱状图,并通过 switch 切换 chart 组件数据的动动态显示。要求实现以下性能:
1.  实现静态数据可视化图表。
2.  关上开关,实现动态图切换为动静可视化图表

相干概念
● switch 组件:开关选择器,通过开关,开启或敞开某个性能。
● chart 组件:图表组件,用于出现线形图、占比图、柱状图界面。

残缺示例
gitee 源码地址

二. 环境搭建

咱们首先须要实现 HarmonyOS 开发环境搭建,可参照如下步骤进行。

软件要求
● DevEco Studio 版本:DevEco Studio 3.1 Release 及以上版本。● HarmonyOS SDK 版本:API version 9 及以上版本。

硬件要求
● 设施类型:华为手机或运行在 DevEco Studio 上的华为手机设施模拟器。
● HarmonyOS 零碎:3.1.0 Developer Release 及以上版本。

环境搭建
1.  装置 DevEco Studio,详情请参考下载和装置软件。
2.  设置 DevEco Studio 开发环境,DevEco Studio 开发环境须要依赖于网络环境,须要连贯上网络能力确保工具的失常应用,能够依据如下两种状况来配置开发环境:如果能够间接拜访 Internet,只需进行下载 HarmonyOS SDK 操作。
a.  如果网络不能间接拜访 Internet,须要通过代理服务器才能够拜访,请参考配置开发环境。
3.  开发者能够参考以下链接,实现设施调试的相干配置:
● 应用真机进行调试
●  应用模拟器进行调试

三. 代码构造解读

本篇 Codelab 只对外围代码进行解说,对于残缺代码,咱们会在源码下载或 gitee 中提供。

├──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 {
  ...
  // 更新线形图数据
  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
      }
    ];
  }
}

实现 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);
  }
}

六. 总结

您曾经实现了本次 Codelab 的学习,并理解到以下知识点:
1.  switch、chart 等组件的应用。

正文完
 0