Android 中 实现柱状图自定义控件

一、基本思路

  • 创建自定义控件的数据模型;
  • 创建一个自定义 View 类,继承自 View;
  • 在初始化方法中获取自定义属性的值。
  • 创建设置数据方法,将数据模型列表转换成自定义绘制时的数据;
  • 重写 onDraw 方法,以实现自定义的绘制逻辑。

二、主要绘制方法

1、drawLine 绘制直线

public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
  • startX 和 startY:起点的 x 和 y 坐标。
  • stopX 和 stopY:终点的 x 和 y 坐标。
  • 线条的样式是 Paint.Style.STROKE

2、 drawLines 绘制一系列直线

public void drawLines(@Size(multiple = 4) @NonNull float[] pts, int offset, int count, @NonNull Paint paint)
public void drawLines(@Size(multiple = 4) @NonNull float[] pts, @NonNull Paint paint)
  • pts:包含点坐标的数组。每条线由数组中的 4 个连续值定义,例如 pts[0] 和 pts[1] 是起点,pts[2] 和 pts[3] 是终点。因此,数组的长度必须是 4 的倍数。
  • offset:从数组中跳过的值的数量。
  • count:在跳过 offset 个值后要处理的值的数量。由于每条线需要 4 个值,因此实际绘制的线条数量为 count / 4,也说明 count 值必须是 4 的倍数。
  • 应用场景:drawLines 方法适用于绘制简单的直线,例如:绘制网格线,绘制坐标轴,绘制界线,在游戏或图表中绘制路径。

3、drawText 绘制文本

public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint)
  • text:要绘制的字符串。
  • x 和 y:文本的起始点坐标(y 是基线的坐标)。
  • paint:用于绘制文本的 Paint 对象。绘制文本时,可通过设置 paint 属性来配置文本的颜色、大小、样式(粗体、斜体、下划线)等属性。

4、drawRect 绘制矩形

public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint)
public void drawRect(@NonNull RectF rect, @NonNull Paint paint)
  • left:矩形的左边界(x 坐标)。
  • top:矩形的上边界(y 坐标)。
  • right:矩形的右边界(x 坐标)。
  • bottom:矩形的下边界(y 坐标)。
  • paint:用于绘制矩形的 Paint 对象,可以设置颜色、填充方式(Paint.Style.FILL 或 Paint.Style.STROKE)、笔触宽度(strokeWidth)、边框样式等。
  • rect:RectF 对象,表示矩形的四个边界。
  • 坐标系:Android 的坐标系以屏幕左上角为原点,x 轴向右为正,y 轴向下为正。
  • 矩形边界:left 必须小于 right,top 必须小于 bottom,否则不会绘制任何内容。
  • 性能优化:如果需要频繁绘制矩形,建议在 onDraw 方法中尽量减少对象创建(如 RectF),以避免内存分配和垃圾回收。

5、Matrix 实现图形变换

  • 在 Android 中,Matrix 类是一个强大的工具,用于处理 2D 图形变换,包括平移、缩放、旋转和倾斜等操作。Matrix 是一个 3×3 的浮点数矩阵,主要用于图像和视图的变换。

(1)缩放(Scale)

public void setScale(float sx, float sy)
  • 基于原点缩放:对图像在 X 轴和 Y 轴方向进行缩放。
  • 例如,setScale(2F, 0.5F) 表示在 X 轴方向放大 2 倍,在 Y 轴方向缩小为原来的一半。
public void setScale(float sx, float sy, float px, float py)
  • 基于指定点缩放:可以指定缩放的中心点。
  • 例如,setScale(2F, 0.5F, 600, 600) 表示以点 (600, 600) 为中心进行缩放。

(2)旋转(Rotate)

public void setRotate(float degrees)
  • 围绕原点旋转:可以围绕原点进行旋转。
  • degrees: 旋转的度数。正数表示顺时针旋转,负数表示逆时针旋转。
public void setRotate(float degrees, float px, float py)
  • 围绕指定点旋转:可以指定旋转的中心点。
  • 例如,setRotate(-30F, 600, 600) 表示以点 (600, 600) 为中心逆时针旋转 30 度。

(3)平移(Translate)

public void setTranslate(float dx, float dy)
  • 平移:可以对图像进行平移操作。
  • 例如,setTranslate(100, 50) 表示将图像向右平移 100 像素,向下平移 50 像素。

(4)倾斜(Skew)

public void setSkew(float kx, float ky) 
  • 基于原点倾斜:可以对图像进行倾斜操作。
  • kx 和 ky:kx 表示在 X 轴方向的倾斜,ky 表示在 Y 轴方向的倾斜。
  • 例如,setSkew(30, 0, 600, 600) 表示以点(600, 600)为中心向 X 轴方向倾斜 30 度。
public void setSkew(float kx, float ky, float px, float py)
  • 基于指定点的倾斜:可以指定倾斜的中心点。
  • 例如,setSkew(30, 0, ) 表示在 X 轴方向倾斜 30 度。

(5)组合变换

  • Matrix 类还支持组合变换,即在一个矩阵中应用多个变换操作。
	val matrix = Matrix()// 缩放matrix.postScale(1.5F, 0.5F)// 旋转matrix.postRotate(30F)// 平移matrix.postTranslate(500F, 200F)
  • setRotate:当你需要从头开始设置一个旋转,且不关心之前的变换状态时,使用 setRotate。
  • postRotate:当你需要在现有变换的基础上追加一个旋转操作时,使用 postRotate。

三、demo 示例

1、数据模型定义

data class ChartModel(val label: String, val value: Int)

2、res/values/attrs.xml 中自定义属性

    <declare-styleable name="BarChartView"><attr name="android:max" format="integer"/><attr name="android:textSize" format="dimension" /><attr name="android:textColor" format="color" /><!-- 0-倾斜日期模式 1-简便日期模式 --><attr name="mode" format="integer"/></declare-styleable>

3、自定义柱状图控件

package com.android.androidfunctiondemo.customviewimport android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.graphics.LinearGradient
import android

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

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

相关文章

Netty 核心原理与实战:从 DiscardServer 看透 Reactor 模式与组件协作

目录 Netty 是什么&#xff1f; Netty 的目标 Netty 实战案例 DiscardServer 服务端程序 NettyDiscardServer 业务处理器 NettyDiscardHandler 配置类 NettyDemoConfig 回顾 Reactor 模式中的 IO 事件处理流程 Netty 中的 Channel Netty 中的 Reactor Netty 中的 Han…

关于“LoggerFactory is not a Logback LoggerContext but Logback is on ......“的解决方案

​ ✨重磅&#xff01;盹猫的个人小站正式上线啦&#xff5e;诚邀各位技术大佬前来探秘&#xff01;✨ 这里有&#xff1a; 硬核技术干货&#xff1a;编程技巧、开发经验、踩坑指南&#xff0c;带你解锁技术新姿势&#xff01;趣味开发日常&#xff1a;代码背后的脑洞故事、工具…

2025年6月电子学会青少年软件编程(C语言)等级考试试卷(三级)

答案和更多内容请查看网站&#xff1a;【试卷中心 -----> 电子学会 ----> C/C ---->三级】 网站链接 青少年软件编程历年真题模拟题实时更新 编程题 第 1 题 打印城门 题目描述 给定一个正整数 n&#xff0c;输出如下的星号城门。具体格式请见样例。 输入格…

跨平台直播美颜SDK开发指南:兼顾性能与美型效果的最佳实践

面对iOS、Android乃至Web等多端应用需求&#xff0c;如何开发一款真正跨平台、兼顾性能与美型效果的美颜SDK&#xff0c;成为众多开发团队和产品经理的一道必答题。 今天笔者这篇文章&#xff0c;就从架构设计、性能优化、视觉效果调校三个关键维度&#xff0c;带你深入解析跨平…

2025数字藏品安全保卫战:高防CDN如何成为NFT应用的“隐形护甲”?

副标题&#xff1a; 从DDoS防御到全球加速&#xff0c;拆解数字资产平台的生死防线&#x1f310; 引言&#xff1a;当数字藏品成为黑客的“头号靶场”2025年全球数字藏品市场突破$1000亿&#xff0c;但安全事件同步激增230%——某头部NFT平台因3.2Tbps DDoS攻击瘫痪&#xff0c…

linux 执行sh脚本,提示$‘\r‘: command not found

1、在Linux下执行某个脚本文件却提示$\r: command not found&#xff0c;如下图:2、错误原因:a、 Windows 风格的换行符&#xff1a;Windows 系统使用 \r\n 作为行结束符&#xff0c;而 Linux 和 Unix 系统使用 \n。当你从 Windows 环境中复制文本到 Linux 环境时&#xff0c;可…

使用HaiSnap做了一款取件码App(一键生成)

你是否怀揣着奇思妙想&#xff0c;却因不懂代码而对开发应用望而却步&#xff1f;现在&#xff0c;有一个神奇AI Agent&#xff08;响指HaiSnap&#xff09;&#xff0c;一个响指就能实现&#xff0c;你说神奇不&#xff1f;只需要一句话就可以生成你想要的应用&#xff01;让你…

容器与虚拟机的本质差异:从资源隔离到网络存储机制

目录 专栏介绍 作者与平台 您将学到什么&#xff1f; 学习特色 容器与虚拟机的本质差异&#xff1a;从资源隔离到网络存储机制 一、容器与虚拟机的本质区别 1.1 资源抽象层次差异 1.2 资源消耗与性能对比 1.3 隔离性深度差异 二、容器网络基础架构 2.1 Docker网络模型…

ros2 launch文件编写详解

一个完整的简单的launch文件配置过程1.编写launch文件2.配置package.xml3.配置setup.py&#xff08;python包&#xff09;4.配置CMakeList(C包)5.编译运行# 在 ROS 2 的 Python 启动文件中&#xff0c;这些导入语句用于引入各类启动模块&#xff0c;以构建和配置节点启动流程 f…

QT中QTableView+Model+Delegate实现一个demo

一、概述功能: 实现一个查询学生信息的表格&#xff0c;有学号、性别、年龄、班级和分数共5列&#xff0c;针对最后一列分数实现委托代理&#xff0c;要求能编辑和查看该分数列。QTableView实现视图展示uiModel负责数据的构造Delegate是委托&#xff0c;可针对某列数据做自定义…

用latex+vscode写论文

文章目录 前言 一、下载texlive安装包 二、安装texlive 1.安装 2.配置环境变量 3.检查是否安装成功 三、安装vscode 四、vscode中安装latex workshop插件 五、创建latex文档 六、撰写+编译+预览 七、latex workshop常用设置 1.打开设置页面 2.设置自动保存代码 3.设置自动编译代…

监测预警系统:让园区更高效、更安全、更智能

随着城市化进程的加快和产业集聚效应的凸显&#xff0c;园区作为经济发展的重要载体&#xff0c;其规模不断扩大&#xff0c;功能日益复杂。在这一背景下&#xff0c;传统的园区管理模式已难以满足现代园区高效、安全、智能的运营需求。园区监测预警系统作为一种集成了物联网、…

分享一个AutoOff定时动作软件

我们平时在使用电脑的时候有很多需求的功能&#xff0c;比如定时打开程序、定时关闭程序、定时休眠、定时关机等等。如果你也有这样的需求&#xff0c;那么就需要今天这款软件。AutoOff定时动作软件AutoOff这个软件是一款定时的软件&#xff0c;软件大小只有1.1M&#xff0c;而…

RPA软件推荐:提升企业自动化效率

在数字化转型浪潮中&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;已成为企业降本增效的核心工具。它通过模拟人类操作&#xff0c;自动化重复性任务&#xff0c;如数据录入、报表生成和系统集成&#xff0c;显著提升运营效率。面对众多RPA软件&#xff0c;如何选择…

【Qt】QTime::toString(“hh:mm:ss.zzz“) 显示乱码的原因与解决方案

在使用 Qt 编写计时器程序时&#xff0c;我遇到一个很奇怪的问题&#xff1a;使用 QTime::toString("hh:mm:ss.zzz") 格式化时间后&#xff0c;显示出来的是一串乱码&#xff0c;如下所示&#xff1a;本来应该是&#xff1a;但却显示了一堆“〇”或奇怪的符号。问题表…

MSVC编译KDChart过程

MSVC编译KDChart过程 一、下载KDChart源文件 GitHub源文件 查看文件夹里的INSTALL.txt&#xff0c;可以看到需要CMake编译。 中文版 以下是使用 CMake 构建系统安装 KD Chart 的说明。 需要 CMake 3.3 或更高版本。Qt 版本支持&#xff1a;* KD Chart 2.5.0 及以下版本需要…

AI Agent管理后台原型设计全拆解(附3套可复用素材)

最近在做AI方向的产品&#xff0c;越来越能感受到“智能体”这个概念正在从技术圈走向应用层。无论是内部探索项目&#xff0c;还是外部合作需求&#xff0c;很多场景都会提到Agent、助手、知识库这些关键词。我们经常讨论如何打造一个有用的AI Agent&#xff0c;但实际上&…

ABP VNext + Elastic APM:微服务性能监控

ABP VNext Elastic APM&#xff1a;微服务性能监控 &#x1f680; &#x1f4da;目录ABP VNext Elastic APM&#xff1a;微服务性能监控 &#x1f680;一、引言 ✨架构全景图 &#x1f3d7;️二、环境与依赖 &#x1f4e6;三、APM 服务器与 Kibana 快速部署 &#x1f433;Doc…

单片机学习笔记.AD/DA(略含有SPI,用的是普中开发板上的XPT2046芯片)

AD/DA基础知识 硬件电路&#xff1a; 模电运放知识回顾&#xff1a; 虚短&#xff08;Virtual Short&#xff09;定义&#xff1a;运放同相输入端&#xff08;&#xff09;和反相输入端&#xff08;-&#xff09;的电位近似相等&#xff0c;即V V-&#xff0c;仿佛两个输入端短…

避坑指南:VMware安装CentOS常见错误及完美解决方案

1. 引言 虚拟机允许在同一台机子上有不同的操作系统&#xff0c;还可以用于搭建实验环境、软件测试和兼容性测试等。我是主攻大数据方向的会用到Linux操作系统&#xff0c;所以虚拟机对我来说是很有必要的。我把之前的笔记和安装包整理了一下&#xff0c;就有了现在这个教程。…