1. サンプルの紹介
このコードラボは、折れ線グラフ、比例グラフ、ヒストグラムを実装するためのスイッチ コンポーネントとチャート コンポーネントに基づいており、スイッチを通じてチャート コンポーネント データの動的表示と静的表示を切り替えます。次の機能が必要です。
- 静的データ視覚化チャートを実装します。
- スイッチをオンにして、静的チャートから動的ビジュアルチャートに切り替えます。
関連概念
- スイッチ コンポーネント: スイッチ セレクター。スイッチを介して特定の機能をオンまたはオフにします。
- グラフ コンポーネント: グラフ コンポーネント。折れ線グラフ、比例グラフ、および棒グラフのインターフェイスを表示するために使用されます。
完全な例
2. 環境構築
まずは HarmonyOS 開発環境の構築を完了する必要がありますので、以下の手順を参照してください。
ソフトウェア要件
- DevEco Studioバージョン: DevEco Studio 3.1 リリース以降。
- HarmonyOS SDKバージョン: API バージョン 9 以降。
ハードウェア要件
- デバイスの種類: Huawei 携帯電話、または DevEco Studio で実行されている Huawei 携帯電話デバイス シミュレータ。
- HarmonyOS システム: 3.1.0 開発者リリース以降。
環境設定
- DevEco Studio をインストールします。詳細については、「ソフトウェアのダウンロードとインストール」を参照してください。
- DevEco Studio 開発環境をセットアップします。DevEco Studio 開発環境はネットワーク環境に依存します。ツールを通常に使用するには、ネットワークに接続する必要があります。次の 2 つの状況に従って開発環境を構成できます。 HarmonyOS SDKをダウンロードするだけでインターネットに直接アクセスでき、操作が可能です。
- ネットワークがインターネットに直接アクセスできず、プロキシ サーバー経由でアクセスする必要がある場合は、「開発環境の構成」を参照してください。
- 開発者は、次のリンクを参照して、デバイス デバッグの関連構成を完了できます。
3. コード構造の解釈
このコードラボではコア コードのみを説明します。完全なコードについては、ソース コードのダウンロードまたは 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 // 应用资源目录
4. メインインターフェイスを構築する
この章では、アプリケーションのメイン ページの実装について説明します。ページは上から下に 2 つの部分に分かれています。
- スイッチ コンポーネントを使用してスイッチ ボタンを実装し、チャート コンポーネント データの動的表示と静的表示を制御します。
- グラフ コンポーネントを使用して、折れ線グラフ、比例グラフ、棒グラフを順番に実装します。
このアプリケーションは、div コンポーネントを外部コンテナとして使用し、テキスト、チャート、スイッチなどの基本コンポーネントをネストして、グラフィックとテキストの表示効果を共同で表示します。
<!-- 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>
5. データを動的に表示する
前章ではスイッチコンポーネントを使用してスイッチボタンを実装する方法を説明しましたが、次にスイッチコンポーネントのクリックイベントを実装します。コールバック メソッドでチャート コンポーネントを静的に表示するか動的に表示するかを設定します。静的の場合、チャート コンポーネントは静的データを表示します。動的の場合、インターバル タイマーを使用してランダム データを動的に生成および表示します。
// 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 メソッドを実装して、割合グラフ データを更新し、3 秒ごとにデータを 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);
}
}
6. まとめ
この Codelab の学習を完了し、次の知識ポイントを学習しました。
- スイッチやチャートなどのコンポーネントの使用。