简单介绍
CustomPaint 可以称之为动画鼻祖,它可以实现任何酷炫的动画和效果。CustomPaint 本身没有动画属性,仅仅是绘制属性,一般情况下,CustomPaint 会和动画控制配合使用,达到理想的效果;CustomPaint 继承自SingleChildRenderObjectWidget,所以不能用 setState() 来刷新。
1 | const CustomPaint({ |
其中:
- painter 就是我们的主绘制工具,它是一个 CustomPainter 画笔角色;
- foregroundPainter 是用来绘制前景的工具;
- size 为画布大小,这个 size 会传递给 Painter;
- isComplex 和 willChange 是告诉 Flutter 你的 CustomPaint 是否复杂到需要使用 cache 相关的功能;
- child 属性我们一般不填,即使想要在 CustomPaint 上添加一些其他的布局,也不建议放在 child 属性中,很难得到想要的结果。
基本使用
CustomPaint 的用法非常简单,绘制的代码写在我们的自定义 CustomPainter 中,如下:
1 | CustomPaint( |
1 | class MyCustomPainter extends CustomPainter { |
当然,还可以设置画笔的一些属性:
1 | class MyCustomPainter extends CustomPainter { |
PaintingStyle.stroke 指的是直接将画笔画在路径的边缘,例如绘制一个圆时,只是边缘有画笔的轨迹,而不是绘制出一个圆饼;strokeWidth即为绘制的宽度。
绘制点
1 |
|

PointMode定义了一组坐标怎样解释,有 3 种模式:
- points:点,单独将这些点绘制
- lines:将 2 个点绘制为线段,如果点的个数为奇数,最后一个点将会被忽略
- polygon:将整个点绘制为一条线
绘制线
1 | canvas.drawLine(Offset(50, 50),Offset(200, 200), _paint); |

绘制路径
1 | void paint(Canvas canvas, Size size) { |

这里注意
Paint.style,还可以设置为PaintingStyle.fill,可将路径包围的范围填充。
绘制各种形状
绘制圆形
1 | canvas.drawCircle(Offset(0, size.height/2), 50, _paint); |
绘制椭圆
1 | canvas.drawOval(Rect.fromLTRB(-200, 100, 200, 300), _paint); |
在矩形内画椭圆,如果矩形为正方形,则椭圆为圆。
绘制弧
1 | canvas.drawArc(Rect.fromLTRB(-200, 0, 100, 300), 0, pi/2, true, _paint); |
绘制圆角矩形
1 | canvas.drawRRect(RRect.fromLTRBR(-200, 200, 200, 400, Radius.circular(10)), _paint); |