当前位置: 首页 > news >正文

基于 OpenHarmony HistogramComponent 柱状图开发指南

1. HistogramComponent 组件功能介绍

1.1. 功能介绍

应用开发过程,用鸿蒙提供的 Component 自定义柱状图效果。

HistogramComponent 组件可以更快速实现一个简单的柱状图功能。

HistogramComponent 对外提供数据源,修改柱状图颜色,间距的接口。

1.2. phone 模拟器上运行效果

2 . HistogramComponent 使用方法

2.1 新建工程,增加组件 Har 包依赖

在应用模块中调用 HAR,常用的添加依赖的方式包括如下两种。

方式一:依赖本地 HAR,将 histogramcomponent-debug.har 复制到 entry\libs 目录下
即可(由于 build.gradle 已经依赖的 libs 目录下的*.har,因此不需要在做修改)。

查看工程目录中 build.gradle 下的*.har 是存在。

以上操作无误之后就可以进行编码了!

3 . HistogramComponent 开发实现

3.1 . 主页面的布局文件

3.2. 主页面的 Ability 的代码

@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
bargraphview = (HistogramComponent)
findComponentById(ResourceTable.Id_bargraphview);
// 设置每组柱状图之间的间距
bargraphview.mLineSpaceWidth = 30;
final int[][] data = {{182, 89, 78, 88}, {34, 85, 16, 96}, {86, 127, 45,
41},{54, 75, 54, 12}};
final int[] colorData = {0xFF222233, 0xFFe67656,
0xFF188888,0xFF888888,0xFF888888};
final String[] textData = {"一月份", "二月份", "三月份", "四月份"};// 核心接口,填充数据,柱状图颜色
bargraphview.setBarGraphData(data, colorData, textData);
}

3.3. HistogramComponent 组件核心代码

/**
* 定义 DrawTask 对象的实例
* 这里进行具体的绘画工作
*/
private DrawTask drawTask = new DrawTask() {
@Override
public void onDraw(Component component, Canvas canvas) {
bottomHeight = heightMeasureSpec - mBottomXWidth;
if (barGraphDataList == null || barGraphDataList.length <= 0)
return;
//画柱状图
drawBarGraph(canvas);
//画 XY 轴坐标
drawXYLine(canvas);
//给 XY 轴坐标写字
drawXYText(canvas);
}
};
//画柱状图
private void drawBarGraph(Canvas canvas) {
if (barGraphDataList != null && barGraphDataList.length > 0) {
for (int i = 0; i < barGraphDataList[0].length; i++) {
float startX = mLineSpaceWidth * (i + 1) + mLineWidth *
barGraphDataList.length * i + mLeftYWidth + (10) + mLineWidth / 2;
int index = 0;
while (index < barGraphDataList.length) {
if (barGraphColorList != null && barGraphColorList.length >
index) {
mBarGraphPaint.setColor(new
Color(barGraphColorList[index]));
mBarGraphTextPaint.setColor(new
Color(barGraphColorList[index]));
} else {
mBarGraphPaint.setColor(new Color(barGraphBgColor));
mBarGraphTextPaint.setColor(new Color(barGraphBgColor));
}
float stopY = bottomHeight * 0.9f / maxHeight *
barGraphDataList[index][i];
canvas.drawLine(new Point(startX, bottomHeight), new
Point(startX, bottomHeight - stopY), mBarGraphPaint);
String text = String.valueOf(barGraphDataList[index][i]);
float textWidth = mBarGraphTextPaint.measureText(text);
canvas.drawText(mBarGraphTextPaint,text, startX - textWidth
/ 2, bottomHeight - stopY - 10);
startX += mLineWidth;
index++;
}
}
}
}
//画 X 轴和 Y 轴的竖线+箭头
private void drawXYLine(Canvas canvas) {
/**
* 让 Y 轴文字与最左有 dip2px(10)的边距
* */
//Y 轴竖线
canvas.drawLine(new Point((10) + mLeftYWidth, bottomHeight), new
Point((10) + mLeftYWidth, 10), mXYLinePaint);
//X 轴竖线
canvas.drawLine(new Point((10) + mLeftYWidth, bottomHeight), new
Point(widthMeasureSpec - 10, bottomHeight), mXYLinePaint);
//画个箭头??Y 轴
canvas.drawLine(new Point((10) + mLeftYWidth, 10), new Point((6) +
mLeftYWidth, 20), mXYLinePaint);
canvas.drawLine(new Point((10) + mLeftYWidth, 10), new Point((14) +
mLeftYWidth, 20), mXYLinePaint);
//X 轴箭头
canvas.drawLine(new Point(widthMeasureSpec - 10, bottomHeight), new
Point(widthMeasureSpec - 20, bottomHeight - (4)), mXYLinePaint);
canvas.drawLine(new Point(widthMeasureSpec - 10, bottomHeight), new
Point(widthMeasureSpec - 20, bottomHeight + (4)), mXYLinePaint);
}
//给 Y 轴和 X 轴写相应的文字
private void drawXYText(Canvas canvas) {
if (isShowYText) {
//Y 轴写字
for (int i = 1; i <= 5; i++) {
float startY = bottomHeight - bottomHeight * 0.9f / maxHeight *
maxHeight / 5 * i;
canvas.drawLine(new Point((10) + mLeftYWidth, startY), new
Point((15) + mLeftYWidth, startY), mYTextPaint);
float width = mYTextPaint.measureText(maxHeight / 5 * i + "");
float dy = 12.0f;
canvas.drawText(mYTextPaint,maxHeight / 5 * i + "", (int) ((10)
+ mLeftYWidth - width - (5)), startY + dy);
}
}
if (!isShowXText) {
return;
}
//X 轴写字
if (barGraphTextList != null && barGraphTextList.length > 0) {
for (int i = 0; i < barGraphTextList.length; i++) {
float startX = mLineSpaceWidth * (i + 1) + mLineWidth *
barGraphDataList.length * i + mLeftYWidth + (10);
//中间有一个间隔
startX = startX + (mLineWidth * barGraphDataList.length) * 1.0f / 2;
float textWidth = mXTextPaint.measureText(barGraphTextList[i]);
canvas.drawText(mXTextPaint,barGraphTextList[i], startX -
textWidth / 2, heightMeasureSpec - (5));
}
}
}
// 对外提供的核心接口
public void setBarGraphData(int[][] barGraphDataList, int[]
barGraphColorList, String[] barGraphTextList) {
this.barGraphDataList = barGraphDataList;
this.barGraphColorList = barGraphColorList;
this.barGraphTextList = barGraphTextList;
for(int i = 0; i < barGraphDataList.length; ++i) {
for(int j = 0; j < barGraphDataList[i].length; ++j) {
if (this.maxHeight < barGraphDataList[i][j]) {
this.maxHeight = barGraphDataList[i][j];
}
}
}
while(this.maxHeight % 5 != 0) {
++this.maxHeight;
}
if (barGraphTextList != null && barGraphTextList.length > 0) {
this.isShowXText = true;
}
if (this.isShowYText) {
this.mLeftYWidth =
this.mYTextPaint.measureText(String.valueOf(this.maxHeight));
}
this.mBottomXWidth = 10.0F;
if (this.isShowXText) {
FontMetrics fontMetrics = this.mXTextPaint.getFontMetrics();
this.mBottomXWidth += ((fontMetrics.bottom - fontMetrics.top) /
2.0F - fontMetrics.bottom) * 2.0F;
}
this.measureWidth(this.heightMeasureSpec);
this.invalidate();
}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

相关文章:

基于 OpenHarmony HistogramComponent 柱状图开发指南

1. HistogramComponent 组件功能介绍 1.1. 功能介绍 应用开发过程&#xff0c;用鸿蒙提供的 Component 自定义柱状图效果。 HistogramComponent 组件可以更快速实现一个简单的柱状图功能。 HistogramComponent 对外提供数据源&#xff0c;修改柱状图颜色&#xff0c;间距的…...

C语言指针相关

C语言指针int(*p)[4]如何理解&#xff1f; 快速搞懂 C/C 指针声明...

设计模式:责任链模式

责任链模式是一种行为设计模式,允许你将请求沿着一条链传递,直到一个对象处理它为止。这种模式包含了一些处理对象,每个对象都包含逻辑来处理特定类型的命令或请求。如果一个对象不能处理该请求,它就会将请求传递给链中的下一个对象,如此类推。 定义 责任链模式通过定义…...

【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.6p1(亲测无问题,建议收藏)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…...

宁波中墙建材对于蒸压加气混凝土砌块2024年前景预测

宁波中墙建材对于蒸压加气混凝土砌块2024年前景预测 蒸压加气混凝土砌块&#xff08;AAC&#xff09;是一种轻质、多孔、保温隔热性能良好的建筑材料&#xff0c;广泛应用于建筑领域。2024年前景预测如下&#xff1a; 市场需求持续增长&#xff1a;随着全球对节能减排和绿色建筑…...

【神经网络】卷积神经网络CNN

卷积神经网络 欢迎访问Blog全部目录&#xff01; 文章目录 卷积神经网络1. 神经网络概览2.CNN&#xff08;Convolutional Neunal Network&#xff09;2.1.学习链接2.2.CNN结构2.2.1.基本结构2.2.1.1输入层2.2.1.2.卷积层|Convolution Layers2.2.1.3.池化层|Pooling layers2.3…...

微信小程序-接入sse数据流并实现打字机效果( ChatGPT )

从流中获取的数据格式如下 小程序调用SSE接口 const requestTask wx.request({url: xxx, // 需要请求的接口地址enableChunked: true, // enableChunked必须为truemethod: "GET",timeout: 120000,success(res) {console.log(res.data)},fail: function (error) {//…...

深入了解iOS内存(WWDC 2018)笔记-内存诊断

主要记录下用于分析iOS/macOS 内存问题的笔记。 主要分析命令&#xff1a; vmmap, leaks, malloc_history 一&#xff1a;前言 有 3 种思考方式 你想看到对象的创建吗&#xff1f;你想要查看内存中引用对象或地址的内容吗&#xff1f;或者你只是想看看 一个实例有多大&#…...

《C语言深度解剖》(4):深入理解一维数组和二维数组

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多数据结构与算法点击专栏链接查看&am…...

信号处理基础

傅里叶分析之掐死教程&#xff08;完整版&#xff09;更新于2014.06.06 先放一篇关于傅里叶变换以及欧拉公式的讲解在这里。后续会搬运到CSDN上。...

原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)

一、题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超…...

如何提升产品用户体验?4个工具+6张案例,让你快速吃透!

在数字时代的浪潮中&#xff0c;产品用户体验早已不再是简单的“好用”或“不好用”的评判标准&#xff0c;它不仅仅是功能的堆砌&#xff0c;更是情感的连接、智慧的体现。在这个竞争激烈的市场中&#xff0c;只有那些能够深入理解用户需求、精准把握用户心理的产品&#xff0…...

C++学习笔记九--模版

目录 前言 1.函数模版 1.函数模版的概念和定义 2.函数模版的实例化 2.类模版 1.类模版的概念和定义 2.类模版的实例化 3.示例代码 前言 这篇文章介绍下C中的模版&#xff0c;包括函数模版和类模版。 1.函数模版 在编程的过程中&#xff0c;编写函数都会考虑将其写成模版…...

19、差分矩阵

差分矩阵 题目描述 输入一个n行m列的整数矩阵&#xff0c;再输入q个操作&#xff0c;每个操作包含五个整数x1, y1, x2, y2, c&#xff0c;其中(x1, y1)和(x2, y2)表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上c。 请你将进行完…...

wordpress外贸独立站模板

wordpress外贸独立站模板 WordPress Direct Trade 外贸网站模板&#xff0c;适合做跨境电商的外贸公司官方网站使用。 https://www.waimaoyes.com/wangzhan/22.html...

HTTP/1.0、HTTP/1.1、HTTP/2.0、HTTP3.0的区别

一、HTTP/1.0 1996年5月&#xff0c;HTTP/1.0版本发布&#xff0c;为了提高系统的效率&#xff0c;HTTP/1.0规定浏览器与服务器只保持短暂的连接&#xff0c;浏览器的每次请求都需要与服务器建立一个TCP连接&#xff0c;服务器完成请求处理后立即断开TCP连接&#xff0c;服务器…...

聚合DNS管理系统v1.0全新发布 域名解析管理系统

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&…...

LabVIEW厂房漏水检测监控系统

LabVIEW厂房漏水检测监控系统 随着信息技术和智能制造的快速发展&#xff0c;对于精密仪器和重要物品存放场所的环境监控日益重要&#xff0c;特别是防止漏水带来的潜在风险。漏水不仅可能导致珍贵资料或仪器的损坏&#xff0c;还可能引发安全事故&#xff0c;给企业和研究机构…...

(3)(3.1) 英特尔Realsense深度摄像头(二)

文章目录 前言 5 配置ArduPilot 6 地面测试&#xff1a;飞行前验证 7 飞行测试 8 实验 9 数据闪存记录 前言 本文介绍如何将英特尔 Realsense 深度摄像头(Intel Realsense Depth Camera)与 ArduPilot 配合使用&#xff0c;以实现避障(obstacle avoidance)。该方法使用在…...

go interface{} 作为函数参数

在 Go 中&#xff0c;将 interface{} 作为函数参数的意义在于使函数接受任意类型的参数。这种参数类型称为空接口&#xff0c;因为它不限制参数的具体类型&#xff0c;可以接受任何类型的值。 使用空接口作为函数参数具有以下几个意义&#xff1a; 通用性&#xff1a; 空接口允…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...