Flutter 绘制图表(一)柱状图📊
前言
本文讲解如何使用 Flutter (Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台) 绘制一个带有动画效果的柱状图表,最终效果如下图。
要绘制这样的图表普通的 Widget 难以实现,这时就需要 CustomPaint
和 CustomPainter
出场了,它们类似于 Web 里面的 <canvas>
元素,CustomPaint
提供了一个绘制区域,而 CustomPainter
拥有具体的绘制方法。
CustomPaint 是什么
CustomPaint
是用来提供画布的控件,它使用传入画笔 painter
在 child
控件后面绘制图形, ,foregroundPainter
画笔绘制在 child
控件之前。size
属性控制画布的大小,假如定义了子控件 child
,那么画布的大小将由子控件的大小决定,size
属性被忽略。
1 | class CustomPaint extends SingleChildRenderObjectWidget { |
而 CustomPainter
是实现绘制图形的控件,要在画布上绘制图形需要实现它的 paint
方法。paint
方法有两个参数,Canvas canvas
和 Size size
。Size
对象表示画布的尺寸,Canvas
对象上是具体的绘制图形的方法。
1 | abstract class CustomPainter extends Listenable { |
Canvas canvas
对象主要的绘制图形方法有
方法名 | 参数 | 效果 |
---|---|---|
drawColor |
Color color , BlendMode blendMode |
绘制颜色到画布上 |
drawLine |
Offset p1 , Offset p2 , Paint paint |
两点之间画线 |
drawPaint |
Paint paint |
使用 [Paint] 填充画布 |
drawRect |
Rect rect , Paint paint |
绘制矩形 |
drawRRect |
RRect rrect , Paint paint |
绘制带圆角的矩形 |
drawOval |
Rect rect , Paint paint |
绘制椭圆 |
drawCircle |
Offset c , double radius , Paint paint |
绘制圆形 |
drawArc |
Rect rect , double startAngle , double sweepAngle , bool useCenter , Paint paint |
绘制弧形 |
drawPath |
Path path , Paint paint |
绘制路径 |
drawImage |
Image image , Offset p , Paint paint |
绘制图像 |
drawPoints |
PointMode pointMode , List<Offset> points , Paint paint |
绘制多个点 |
要将图形绘制到画布上需要先创建一个继承至 CustomPainter
的自定义画笔,例如绘制一个矩形需要实现一个绘制矩形的画笔 RectanglePainter
,然后在画布 CustomPaint
上应用它。
1 | class RectanglePainter extends CustomPainter { |
效果如图
绘制柱状图表
介绍完毕,下面开始绘制柱状图表,第一步创建 BarChart
控件代表柱状图,它有两个构造参数一个是 data
用来接收图表数据,以及 xAxis
表示图表横轴标识。
1 | class BarChart extends StatefulWidget { |
然后创建一个用来绘制的自定义画笔 BarChartPainter
。
1 | class BarChartPainter extends CustomPainter { |
绘制坐标轴
在 BarChartPainter
上定义一个 _drawAxis
方法用于绘制横坐标轴,使用一个由左上,左下,右下三个点控制的 Path
路径绘制。
1 | void _drawAxis(Canvas canvas, Size size) { |
效果如下
绘制标识
在 BarChartPainter
上定义一个 _drawLabels
方法绘制纵轴标识。
1 | void _drawLabels(Canvas canvas, Size size) { |
效果如下
绘制数据矩形
然后定义一个 _darwBars
方法将具体矩形和横轴标识绘制出来。
1 | List<Color> colors = [ |
效果如下
添加运动动画
最后在 _BarChartState
里使用一个 AnimationController
创建柱状图运动的动画,关于动画方面的知识可以查阅 从零开始的 Flutter 动画 这篇文章。
1 | class _BarChartState extends State<BarChart> with TickerProviderStateMixin { |
至此整个柱状图的绘制就完成了,传入数据即可使用 🎉🎉🎉
1 | BarChart( |
完整代码地址:bar_chart.dart
总结
本文说明了什么是 CustomPaint
和 CustomPainter
。以及如何使用它们绘制一个带有动画的柱状图表。
附言
准备写一系列关于用 Flutter 画图表的文章,用来分享这方面的知识,这篇文章是这个系列的开篇,预计一共会写 6 篇。
- Flutter 绘制图表(一)柱状图📊(本文)
- Flutter 绘制图表(二)饼状图🍪
- Flutter 绘制图表(三)折线图📈
- Flutter 绘制图表(四)雷达图🎯
- Flutter 绘制图表(五)环状图🍩
- Flutter 绘制图表(六)条形图📏