【Flutter 专题】112 图解自定义 ACEPieWidget 饼状图 (一)

news2024/11/26 19:28:52
  1. 类别选项球;
  2. 切割绘制饼状图;
  3. 饼状图中绘制文字;

1. 类别选项球

对于两侧不同颜色类别选项卡,仅需要简单设置一下 Containerdecoration 装饰器即可,只是方便用户查看饼状图分类而已;

return Container(
height: 45, width: 45,
margin: EdgeInsets.symmetric(vertical: 2.5, horizontal: 10),
decoration: BoxDecoration(color: _color, borderRadius: BorderRadius.circular((25.0))),
child: Center(child: Text(_text, style: TextStyle(fontSize: 12, color: Colors.white))));

2. 饼状图绘制

对于 Canvas 的基本绘制,小菜在之前的博客中有过简单介绍;此次小菜也是使用最基本的 drawArc 绘制扇形拼接为一个完整圆形方式;

  1. 获取 ListData 总的数据值;
  2. 遍历 ListData 根据各个子类别数据比例和旋转角度进行不​
    同颜色的扇形图绘制;
  3. 最终拼接为完整饼状图;

注意:在绘制扇形图时需要注意扇形图的起始角度和终止角度,需要累加上一次绘制的扇形图角度;

// 1. 设置画笔
Paint _paint = Paint()…color = Colors.grey
…strokeWidth = 4.0…style = PaintingStyle.fill;
// 2. 获取 ListData 总的数据值
_sumData() {
if (_listData != null) {
for (int i = 0; i < _listData.length; i++) {
_sum += _listData[i].values.first;
}
}
}
// 3. 根据各个子类别数据比例和旋转角度进行不同颜色的扇形图绘制
if (_listData != null) {
for (int i = 0; i < _listData.length; i++) {
startAngle += sweepAngle;
sweepAngle = _listData[i].values.first * 2 * PI / _sum;
canvas.drawArc(_circle, startAngle, sweepAngle, true,
_paint…color = _subPaint(_listData[i].keys.first));
}
}
}

3. 文字绘制

饼状图绘制好之后就是在各自的扇形面积上绘制文字;其中小菜规定,只有扇形图角度大于等于 30 度的时候才会进行文字绘制,如果扇形图角度太小绘制显示效果不佳;

  1. 文字的初始绘制点默认是以屏幕左上角为坐标原点,此时在扇形面内进行绘制时首先需要通过 translate() 平移坐标系至饼状图圆心;
  2. 绘制文字的角度要与扇形的角平分线平行,此时通过 rotate() 对坐标系进行适当角度的旋转;
  3. 小菜无法得知文字占据坐标长度,但是可以通过 Paragraph 获取文字绘制时所占据高度,因此在通过 drawParagraph 绘制文字时适当设置文字起始坐标,y 轴坐标向上平移文字高度的一半;
  4. 再文字绘制结束之后,将坐标系 rotate() 旋转回正常水平竖直方向,并将起始坐标 translate() 平移恢复至屏幕左上角;待下次文字绘制;

// 1. 绘制文笔属性(颜色,尺寸等)和最大段落宽度
ParagraphBuilder _pb = ParagraphBuilder(ParagraphStyle(
textAlign: TextAlign.left, fontWeight: FontWeight.w600,
fontStyle: FontStyle.normal, fontSize: 14))
…pushStyle(ui.TextStyle(color: Colors.white));
ParagraphConstraints _paragraph = ParagraphConstraints(width: size.width * 0.5);

if (sweepAngle >= PI / 6) {
// 2. 平移坐标系
canvas.translate(size.width * 0.5, size.height * 0.5);
// 3. 设置旋转角度
canvas.rotate(startAngle + sweepAngle * 0.5);
// 4. 文字绘制
Paragraph paragraph = (_pb…addText(_subName)).build()…layout(_paragraph);

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取
你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

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

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

相关文章

不用写一行代码,deepseek结合腾讯云语音识别来批量转录Mp3音频

首先&#xff0c;打开window系统中的cmd命令行工具&#xff0c;或者powershell&#xff0c;安装腾讯云tencentcloud的Python库 pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python 然后&#xff0c;开通腾讯云的对象存储COS服务&…

【小沐学AI】Python实现语音识别(Whisper-Web)

文章目录 1、简介2、下载2.1 openai-whisper2.2 whisper-web 结语 1、简介 https://openai.com/index/whisper/ Whisper 是一种自动语音识别 &#xff08;ASR&#xff09; 系统&#xff0c;经过 680,000 小时的多语言和多任务监督数据的训练&#xff0c;从网络上收集。我们表…

【大数据 复习】第8章 Hadoop架构再探讨

一、概念 1.Hadoop1.0的核心组件&#xff08;仅指MapReduce和HDFS&#xff0c;不包括Hadoop生态系统内的Pig、Hive、HBase等其他组件&#xff09;&#xff0c;主要存在以下不足&#xff1a; &#xff08;1&#xff09;抽象层次低&#xff0c;需人工编码 &#xff08;2&#xf…

Docker常用命令与实战示例

docker 1. 安装2. 常用命令3. 存储4. 网络5. redis主从复制示例6. wordpress示例7. DockerFile8. 一键安装超多中间件&#xff08;compose&#xff09; 1. 安装 以centOS系统为例 # 移除旧版本docker sudo yum remove docker \docker-client \docker-client-latest \docker-c…

AI时代的音乐革命:创作更简单,灵魂在哪里?

#AI在创造还是毁掉音乐# 我是李涛&#xff0c;一名音乐创作者&#xff0c;最近一直在思考一个问题&#xff1a;AI到底是在创造音乐&#xff0c;还是在毁掉音乐&#xff1f; 几个月前&#xff0c;我第一次接触到AI音乐创作工具。它让我震惊&#xff0c;只需要输入几个关键词&a…

数据结构7---图

一、定义 对于图的定义&#xff0c;我们需要明确几个注意的地方:一线性表中我们把数据元素叫元素&#xff0c;树中叫结点&#xff0c;在途中数据元素我们则称之为顶点(Vertex)。 对于图的定义&#xff0c;我们需要明确几个注意的地方: 线性表中我们把数据元素叫元素&#xf…

实现文件分片合并功能并使用Github Actions自动编译Release

一、编译IOS镜像 1.1 编译 起因是公司电脑使用的Win11 23H2的预览版&#xff0c;这个预览版系统的生命周期只到2024-09-18&#xff0c;到期后就会强制每两小时重启。这是Windows强制升级系统的一种手段。 虽然公司里的台式电脑目前用不到&#xff0c;但是里面还保留许多旧项…

Jenkins定时构建自动化(一):Jenkins下载安装配置

目录 ​编辑 一、jdk下载安装 1. 已下载安装jdk 2. 未下载安装jdk 二、jenkins安装 1. .war包安装 三、获取IP地址 四、jenkins网页配置 一、jdk下载安装 1. 已下载安装jdk &#xff08;1&#xff09;查询jdk版本命令&#xff1a;java -version &#xff08;2&#xff09;…

[SAP ABAP] 运算符

1.算数运算符 算术运算符描述加法-减法*乘法/除法MOD取余 示例1 输出结果: 输出结果: 2.比较运算符 比较运算符描述示例 等于 A B A EQ B <> 不等于 A <> B A NE B >大于 A > B A GT B <小于 A < B A LT B >大于或等于 A > B A GE B <小…

Html去除a标签的默认样式

Html去除a标签的默认样式, a标签超链接字体默认蓝色带下划线; 去除可用: a{text-decoration:none;color:inherit;cursor:auto; }测试代码 <!DOCTYPE html> <html lang"zh-CN" dir"ltr"><head><meta charset"utf-8"/>&…

【开发12年码农教你】Android端简单易用的SPI框架-——-SPA

Service(priority 1) public class APrinterService implements IPrinterService { Override public void print() { System.out.println(“this is a printer service.”); } } 复制代码 B模块 —— BPrinterService Service(path“b_printer”, priority 2) public class…

微积分-导数1(导数与变化率)

切线 要求与曲线 C C C相切于 P ( a , f ( a ) ) P(a, f(a)) P(a,f(a))点的切线&#xff0c;我们可以在曲线上找到与之相近的一点 Q ( x , f ( x ) ) Q(x, f(x)) Q(x,f(x))&#xff0c;然后求出割线 P Q PQ PQ的斜率&#xff1a; m P Q f ( x ) − f ( a ) x − a m_{PQ} \…

java小代码(1)

代码 &#xff1a; 今日总结到此结束&#xff0c;拜拜&#xff01;

FlinkCDC sink paimon 暂不支持exactly-once写入,而通过 幂等写

幂等写入&#xff1a; 一个幂等操作无论执行多少次都会返回同样的结果。例如&#xff0c;重复的向hashmap中插入同样的key-value对就是幂等操作&#xff0c;因为头一次插入操作之后所有的插入操作都不会改变这个hashmap&#xff0c;因为hashmap已经包含这个key-value对了。另一…

算法期末整理

目录 一 算法概述 二 递归与分治策略 三 动态规划 四 贪心算法 五 回溯法 六 分支限界法 七 随机化算法 八 线性规划与网络流 一 算法概述 算法的概念 通俗地讲&#xff0c;算法是指解决问题的一种方法或一个过程。更严格地讲&#xff0c;算法是由若干条指令组成的有穷…

android 对不同日期和时间的格式方法的封装

break; default: result “星期一”; break; } return result; } /** 判断两个时间是否属于同一天 param time1 param time2 return */ public boolean isSameDay(long time1, long time2) { Calendar calen Calendar.getInstance(); calen.setTimeInMillis(t…

ROS | 常见故障排查

1.开启后发出一个WIFI WIFI名字&#xff1a;WHEELTEC接数字 安全密钥&#xff1a;dongguan 2.显示屏接口 USB接口接键鼠 3.远程登录命令 ssh -Y wheeltec192.168.0.100 是小车发出的WIFI的一个IP地址 4. 登录后确保IP地址 ip a 看一下 当前ip地址 倒数第四行-当前ip地址 1…

读AI新生:破解人机共存密码笔记09精神安全权

1. 自动化史塔西 1.1. 作恶的创新也在快速发展 1.1.1. 心怀恶意的人们正在迅速地想出滥用人工智能的新方法 1.2. 史塔西&#xff08;Stasi&#xff09;是得意智皿煮国和共家国部全安更广为人知的名字&#xff0c;它被广泛认为是“有史以来最高效、最具性压镇的报情和秘密惊诧…

[SAP ABAP] 工作区

工作区是指多个预定义类型变量组成的一个变量(可理解为一组变量的集合) 程序中使用DATA关键字定义工作区 示例1 上述代码定义了2个工作区 lw_student0 和 lw_student1 示例2 lw_student是一个工作区 输出结果: 1.工作区变量赋值 示例1 输出结果如下所示&#xff1a; 示例2…

C++ | Leetcode C++题解之第179题最大数

题目&#xff1a; 题解&#xff1a; class Solution { public:string largestNumber(vector<int> &nums) {sort(nums.begin(), nums.end(), [](const int &x, const int &y) {return to_string(x) to_string(y) > to_string(y) to_string(x);});if (nu…