Flutter Canvas绘制快速入门

Flutter是Google的UI框架,所以绘制也秉承了Android的那套东西,坐标起点是从左上角开始的,API也非常相似,对Android开发者特别的友好。

CustomPaint

const CustomPaint({
  Key? key,
  this.painter,
  this.foregroundPainter,
  this.size = Size.zero,
  this.isComplex = false,
  this.willChange = false,
  Widget? child,
})

参数说明

painter:在child之前绘制。绘制背影,child在上面。

foregroundPainter:在child之后才绘制。绘制前景,在child上。

size: 绘制画布的大小,默认为Size.zero,也就是0。不设置child时,CustomPainter会以这个Size进行绘制。当设置了child之后,size会被忽略,CustomPainter会使用child的size进行绘制。如果size和child的size都没有设置,那会根据CustomPaint的父widget的size进行绘制。如果3个都不设置,那size为Size.zero。

CustomPainter

/// Creates a custom painter.
///
/// The painter will repaint whenever `repaint` notifies its listeners.
const CustomPainter({ Listenable? repaint }) : _repaint = repaint;

repaint:提高性能,避免不必要的重绘。如果传入了,每次重绘时不会重新创建画布来绘制。每次都是同一个CustomPainter实例在触发paint方法。一般在频繁绘制时使用。

绘制

void paint(Canvas canvas, Size size)

canvas的坐标原点(0,0)不是基于屏幕左上角,而是基于父Widget的左上角。

一般我们需要根据size来绘制,如果不依赖size,可能会超出父Widget本身的大小。

样式

通过Painter设置绘制的样式。

Paint _paint = Paint()
  		/// 设置画笔颜色
      ..color = Colors.blue
  		/// 画笔宽度
      ..strokeWidth = 2
  		/// 绘制形状和路径的样式。stroke只是线,fill会填充路径。默认为fill.
  		..style = PaintingStyle.stroke;

画直线

/// 从父widget左上角开始,画一条长度为100的直线
canvas.drawLine(Offset(0,0), Offset(100,100), _paint);

画点

canvas.drawPoints(PointMode.polygon,points,_paint);

将点连起来,可以用来画直线或折线。

canvas.drawPoints(PointMode.points,points,_paint);

矩形

/// 直角矩形
canvas.drawRect();
///圆角矩形
canvas.drawRRect();
//同时绘制2个矩形,一个外框,一个内框。
canvas.drawDRRect();

弧形

void drawArc(Rect rect, double startAngle, double sweepAngle, bool useCenter, Paint paint)

  • rect:弧形所在的矩形。
  • startAngle:弧的起始点。0是矩形的右侧垂直中心。
  • sweepAngle:孤的长度。
  • useCenter:是否闭合路径。跟Photoshop中闭合路径效果一样。

注意:
参数中的startAngle和sweepAngle代表的不是角度,而是弧度。
第一次用的时候以为和Android中一样,用0到360度来画。
我们可以把弧度理解为周长,想画半圈就是pi,4分之一圈就是pi/2,以此类推。
狐度转角度: pi/180

示例:

/// 四分之一弧。
canvas.drawArc(Rect.fromLTRB(50, 100, 250, 200), 0, pi/2, false, _paint);
/// 半圆弧
canvas.drawArc(Rect.fromLTRB(50, 100, 250, 200), 0, pi, false, _paint);
/// 闭合路径
canvas.drawArc(Rect.fromLTRB(50, 100, 250, 200), 0, pi, false, _paint);

42lw2n.jpg

42MkGR.jpg

42Yw24.jpg

画圆

drawCircle:正圆

drawOval:根据传入的Rect,画正圆和椭圆

/// 正圆
canvas.drawCircle(Offset(100, 100), 30, _paint);
/// 也是正圆
canvas.drawOval(Rect.fromLTRB(0,0,100,100),_paint);
/// 椭圆
canvas.drawOval(Rect.fromLTRB(0,0,100,100),_paint);

颜色

会将颜色应用到之前绘制的内容上,除了文字。

canvas.drawColor(Colors.red, BlendMode.color);

图片

canvas.drawImage();
canvas.drawImageNine();
canvas.drawImageRect();
canvas.drawPicture();
canvas.drawAtlas();

文字

绘制文字有2种方式。

canvas.drawParagraph(UI.ParagraphBuilder(UI.ParagraphStyle()).build(), Offset(100,100));
TextPainter.paint(canvas,offset);

路径

drawPath()

Path path = Path();
path.lineTo(100, 100);
path.lineTo(200, 100);
canvas.drawPath(path, _paint);

3D

canvas.drawVertices();
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter CanvasFlutter 框架提供的一个功能强大的绘图 API,它允许你直接在屏幕上绘制图形、文本和其他视觉元素。你可以使用 Flutter Canvas 创建自定义的 UI 控件、动画效果以及图表等。 通过 Flutter Canvas,你可以使用各种绘图方法来绘制形状、路径、渐变、图片和文本等。你可以使用 Canvas 类提供的方法来绘制直线、曲线、圆形、矩形等基本形状,还可以使用 Path 类来创建复杂的路径。同时,你也可以设置画笔的样式、颜色和透明度等属性,来实现各种视觉效果。 在 Flutter 中使用 Canvas,你需要在自定义的绘制方法中重写父类的 paint 方法,并将 Canvas 对象作为参数传入。然后,你可以在这个方法中使用 Canvas 对象提供的方法来绘制你想要的图形。 例如,下面是一个简单的 Flutter Canvas 绘制一个红色圆形的示例代码: ```dart import 'package:flutter/material.dart'; class MyCanvasWidget extends StatelessWidget { @override Widget build(BuildContext context) { return CustomPaint( painter: MyPainter(), ); } } class MyPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { final paint = Paint() ..color = Colors.red ..style = PaintingStyle.fill; final center = Offset(size.width / 2, size.height / 2); final radius = size.width / 4; canvas.drawCircle(center, radius, paint); } @override bool shouldRepaint(covariant CustomPainter oldDelegate) { return false; } } ``` 这段代码定义了一个自定义的绘制 Widget `MyCanvasWidget`,并在其 `paint` 方法中使用 Canvas 绘制了一个红色的圆形。在 Flutter 的 UI 树中使用 `CustomPaint` 包裹这个自定义的绘制 Widget,即可将这个绘制效果显示在屏幕上。 希望这个简单的示例可以帮助你了解 Flutter Canvas 的基本使用方法。如果你有更多关于 Flutter Canvas 的问题,欢迎继续提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值