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 绘制图表(六)条形图📏