HarmonyOS运动开发:如何用mpchart绘制运动配速图表

news2025/6/13 18:41:47

##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)#

前言

在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰地了解自己的运动表现,从而更好地调整运动计划。本文将结合鸿蒙(HarmonyOS)开发实战经验,如何使用 mpchart 绘制运动配速图表,让运动数据的展示更加生动有趣。

在这里插入图片描述

一、为什么选择 mpchart

mpchart 是一个功能强大的图表库,支持多种类型的图表,如折线图、柱状图、饼图等。它具有以下特点:

• 丰富的图表类型:提供了多种图表类型,满足不同场景下的数据可视化需求。

• 高度可定制:可以通过丰富的 API 自定义图表的样式、颜色、标签等。

• 性能优化:在绘制大量数据时,mpchart 能够保持良好的性能,确保应用流畅运行。

• 跨平台支持:支持多种平台,包括 Android、iOS 和 HarmonyOS,方便开发者在不同平台上实现一致的图表展示效果。

二、初始化配置

在使用 mpchart 绘制运动配速图表之前,我们需要进行一些初始化配置。以下是初始化配置的代码:

import { LineChartModel, Description, Legend, LimitLine, LineData, LineDataSet, EntryOhos, JArrayList, ChartColorStop, ILineDataSet, XAxisPosition, YAxisLabelPosition, LegendForm, LimitLabelPosition, Mode } from '@ohos/mpchart';

aboutToAppear(): void {
  // Step1:必须:初始化图表配置构建类
  this.model = new LineChartModel();

  // Step2:配置图表指定样式,各部件间没有先后之分

  // 为图表添加数据选择的监听器
  // this.model.setOnChartValueSelectedListener(this.valueSelectedListener);
  // 获取图表描述部件,设置图表描述部件不可用,即图表不进行绘制描述部件
  let description: Description | null = this.model.getDescription()
  if (description) {
    description.setEnabled(false);
  }

  // 获取图表图例部件,设置图表图例形状为线形
  let legend: Legend | null = this.model.getLegend();
  if (legend) {
    legend.setEnabled(false);
    // draw legend entries as lines
    legend.setForm(LegendForm.LINE);
  }

  // 为左Y轴设置LimitLine,可设置限制线的宽度,线段样式,限制标签的位置,标签字体大小等
  let limitLine1 = new LimitLine(120, 'Upper Limit');
  limitLine1.setLineWidth(0);
  //设置虚线样式
  limitLine1.enableDashedLine(10, 10, 0);
  //设置标签位置
  limitLine1.setLabelPosition(LimitLabelPosition.RIGHT_TOP);
  limitLine1.setTextSize(10);

  // 设置图表左Y轴信息
  let leftAxis = this.model.getAxisLeft();
  if (leftAxis) {
    leftAxis.setAxisLineWidth(0)
    //设置绘制标签个数
    leftAxis.setLabelCount(6, false);
    //设置标签位置
    leftAxis.setPosition(YAxisLabelPosition.OUTSIDE_CHART)
    //设置自定义标签格式化
    leftAxis.setValueFormatter(new MyIAxisValueFormatter())
  }

  // 设置图表右Y轴信息
  let rightAxis = this.model.getAxisRight();
  if (rightAxis) {
    rightAxis.setEnabled(false);
  }

  // 设置X轴信息
  let xAxis = this.model.getXAxis();
  if (xAxis) {
    xAxis.setPosition(XAxisPosition.BOTTOM);
    xAxis.setDrawGridLines(false);
    xAxis.setGranularity(1);
    xAxis.setLabelCount(5);
    xAxis.setValueFormatter(new MyXIAxisValueFormatter())
  }

  // 生成图表数据
  let lineData: LineData = this.getLineData();
  // 将数据与图表配置类绑定
  this.model.setData(lineData);
}

核心点解析

Description:设置图表描述部件,可以启用或禁用描述部件。

Legend:设置图表图例部件,可以自定义图例的形状和样式。

LimitLine:为 Y 轴设置限制线,可以设置线的宽度、样式、标签位置等。

XAxisYAxis:分别设置 X 轴和 Y 轴的样式,包括标签位置、标签格式化等。

LineData:生成图表数据,绑定到图表配置类中。

三、数据填充

在初始化配置完成后,我们需要填充数据到图表中。以下是数据填充的代码:

private getLineData(): LineData {
  let values: JArrayList<EntryOhos> = new JArrayList<EntryOhos>();
  for (let i = 0; i < this.record!.points.length; i++) {
    let point = this.record!.points[i];
    let speed = point.speed; // 当前速度
    let time = point.netDuration; // 时间
    values.add(new EntryOhos(time, speed));
  }

  let dataSet = new LineDataSet(values, '配速');
  dataSet.setHighlightEnabled(false);
  dataSet.setDrawIcons(false);

  dataSet.setMode(Mode.LINEAR); // 直线模式
  dataSet.setDrawCircles(false); // 不绘制数据点圆圈
  dataSet.setDrawCircleHole(false); // 不绘制内部孔
  dataSet.setColorByColor(0xFFFE9543); // 设置折线颜色

  // 渐变色填充
  let gradientFillColor = new JArrayList<ChartColorStop>();
  gradientFillColor.add(["#99FE9543", 0]);
  gradientFillColor.add(["#00FE9543", 1]);
  dataSet.setGradientFillColor(gradientFillColor);
  dataSet.setDrawFilled(true);

  // 设置数据点的颜色
  dataSet.setCircleColor(Color.Blue); // 设置为你想要的颜色

  // 设置数据点的半径
  dataSet.setCircleRadius(4); // 设置半径大小
  dataSet.setCircleHoleRadius(2); // 设置内径

  let dataSetList: JArrayList<ILineDataSet> = new JArrayList<ILineDataSet>();
  dataSetList.add(dataSet);

  let lineData: LineData = new LineData(dataSetList);
  return lineData;
}

核心点解析

EntryOhos:表示图表中的一个数据点,包含 X 和 Y 坐标。

LineDataSet:表示一组数据点,可以设置数据点的样式、颜色、渐变色填充等。

LineData:表示图表的数据集合,可以包含多个LineDataSet

四、样式展示

在数据填充完成后,我们需要将图表展示到页面上。以下是样式展示的代码:

@Builder
DataAnalysisBuilder() {
  Column() {
    Text('配速变化趋势')
      .fontSize(16)
      .fontWeight(FontWeight.Medium)
      .margin({ top: 16, bottom: 8 })
      .width('100%')
      .textAlign(TextAlign.Start)
      .padding({ left: 16 })

    Row() {
      Column() {
        Text('最快')
          .fontSize(12)
          .fontColor('#666')
        Text(RunUtil.secondsToPace(Math.min(...this.record!.points.map(p => p.pace))))
          .fontSize(20)
          .fontColor('#333')
          .margin({ top: 4 })
      }.layoutWeight(1)

      Column() {
        Text('平均')
          .fontSize(12)
          .fontColor('#666')
        Text(RunUtil.secondsToPace(this.record!.avgPace))
          .fontSize(20)
          .fontColor('#333')
          .margin({ top: 4 })
      }.layoutWeight(1)
    }.width('100%').padding(16)

    LineChart({ model: this.model })
      .width('100%')
      .height(240)
      .backgroundColor(Color.White)
      .margin({ top: 8 })
  }.width('100%').backgroundColor('#F5F5F5')
}

核心点解析

LineChart:表示图表组件,通过绑定model属性展示图表。

Text:用于展示文本信息,如标题、数据标签等。

RowColumn:用于布局,分别表示水平和垂直布局。

五、总结

通过 mpchart,我们可以轻松实现运动配速图表的绘制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…