Flutter 绘制图表(二)饼状图🍪
前言
接上文,本文讲解如何使用 Flutter 绘制饼状图,最终效果如图
定义 PieChart & PiePart
第一步定义 PieChart
和 PiePart
类。PieChart
是整个饼状图控件,有 datas
和 legends
两个属性,表示饼图的数据和每部分的标识。PiePart
表示饼图的一部分,有 color
, startAngle
, sweepAngle
三个属性,分别表示颜色,起始弧度值,占据圆形的弧度值。PeiChartPainter
类实现了具体的绘制方法。
1 | class PiePart { |
绘制圆框
先绘制图表的圆框,在 PeiChartPainter
上添加 drawCircle
方法,以圆的中心点和圆的半径绘制一个空心圆形。
1 | void drawCircle(Canvas canvas, Size size) { |
绘制标识
这一步需要先在 _PieChartState
里面进行数据的初始化,然后绘制每个数据对应的标识,分以下几步进行
- 计算出每个数据占总和的占比
- 根据占比计算数据占据圆的弧度值
- 根据之前数据占据圆形的弧度值计算出下一个数据的起始弧度值
- 根据计算出的起始弧度值和占据弧度值创建
PiePart
对象 - 使用
PiePart
对象绘制标识
1 | class _PieChartState extends State<PieChart> with TickerProviderStateMixin { |
在 PeiChartPainter 上添加 drawLegends
方法,在圆框的外围绘制每部分对应的标识。
1 | void drawLegends(Canvas canvas, Size size) { |
计算文字位置用到的的三角函数是
绘制数据对应的弧形
在 PeiChartPainter
上添加 drawParts
方法,绘制每个数据对应的弧形。
1 | void drawParts(Canvas canvas, Size size) { |
添加动画
最后给饼图添加一个数据不断增长的动画效果,在 _PieChartState
添加动画的控制器 _controller
和保存动画数据的 _animateDatas
数组。在 initState
中初始化动画控制器和填充 _animateDatas
数组。然后创建两个 double
类型的补间动画,将动画值传给 PeiChartPainter
使用即可。
1 | class _PieChartState extends State<PieChart> with TickerProviderStateMixin { |
至此整个饼状图的绘制就完成了,传入数据即可使用 🎉🎉🎉
1 | PieChart( |
完整代码地址:pie_chart.dart
总结
本文说明了如何使用 Flutter 绘制一个饼状图,使用了一点三角函数,关键点在于计算出每个数据占据整个圆形的弧度值,以及数据的起始弧度值。
数值增长的动画效果使用一个 AnimationController
在开始动画后不断的更新绘制使用的数据,在将数据传递给 PeiChartPainter
使用即可实现。
附言
准备写一系列关于用 Flutter 画图表的文章,用来分享这方面的知识,这篇文章是这个系列的第二篇,预计 6 篇。
- Flutter 绘制图表(一)柱状图📊
- Flutter 绘制图表(二)饼状图🍪(本文)
- Flutter 绘制图表(三)折线图📈
- Flutter 绘制图表(四)雷达图🎯
- Flutter 绘制图表(五)环状图🍩
- Flutter 绘制图表(六)条形图📏