敞开成长之旅!这是我参与「日新计划 12 月更文应战」的第6天,点击检查活动概况

说起canvas,或许许多人都有过了解和运用. 本文主要意指详解canvas的能力.

准备工作

如果你正准备学习flutter的canvas, 那么无妨和笔者一样打开idea. 然后紧跟着内容自己也敲一遍.
ps: 友情提示,自己敲一遍, 影响更深刻哦~

首要创立一个widget,在其间回来一个CustomPaint

  Widget build(BuildContext context) {
    return CustomPaint(
      size: const Size(100, 100),
      painter: _DemoPainter(),
    );
  }

其次,咱们需求准备好画笔. 正所谓工欲善其事,必先利其器.

/// 创立画画的载体
class _DemoPainter extends CustomPainter {
  // 创立画布
  final Paint _paint = Paint()..color = Colors.blue;
  @override
  void paint(Canvas canvas, Size size) {
      // 这儿去正式的制作
  }
  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;
  }
}

准备好工具后,咱们还需求知道咱们画布是依据笛卡尔坐标系的.以咱们的手机为例.当手机正对咱们时, 手机的左上角即为原点, 从左上角到右上角即为正x轴,从左上角到左下角即为正y轴.

Flutter canvas 详解
在了解完这些根底概念后,让咱们一同具体的探究canvas的世界吧!

探究

drawLine

drawLine(Offset p1, Offset p2, Paint paint) 即制作一条直线, 其间, p1为初始点,p2为终点来制作一条线段.

Flutter canvas 详解

drawCircle

drawCircle(Offset c, double radius, Paint paint) 能够在画布上制作一个圆. 其间, c 代表者圆心, radius 代表者半径. paint 自然代表着咱们之前生成的画笔了(以下不再赘述该属性). 这儿的代码代表着咱们以往右和下别离偏移50dp的点为圆心, 以50为半径制作圆.

canvas.drawCircle(Offset(50.0, 50.0), 50.0, _paint);

Flutter canvas 详解

drawRect

drawRect(Rect rect, Paint paint) 能够用来制作一个矩形.rect代表了矩形的描绘*. 它能够经过五种命名构造办法来简单

    // 制作矩形
    // 从偏移的中心动身,中心即为矩形中心,以长宽制作矩型
    // Rect.fromCenter(center: center, width: width, height: height);
    //
    // 从原点动身,离原点往右left,往下top单位为矩形左上角,往右right,往下bot// tom为右下角画矩型
    // Rect.fromLTRB(left, top, right, bottom);
    //
    // 从center为圆心,直径为长宽画矩形。实际上也便是正方形
    // Rect.fromCircle(center: center, radius: radius);
    //
    // 从原点往右left, 往下top为矩形左上角, widthheight为长宽制作
    // Rect.fromLTWH(left, top, width, height);
    //
    // a.b别离为矩形的对角点
    // Rect.fromPoints(a, b);
    canvas.drawRect(Rect.fromCircle(center: Offset.zero, radius: 100), _paint);

Flutter canvas 详解
ps: drawRRect 实际上和drawRect差不多, 它用来制作圆角矩形. 有兴趣的能够自己测验一下或许参阅一下结束中的源码.
Flutter canvas 详解

drawOval

drawOval(Rect rect, Paint paint) 能够制作一个椭圆形.它供给了rect 的参数. rect 是用来描绘一个矩形的形状. 而制作的椭圆也便是以中心为圆心,轴对其.边贴边的一个椭圆.这儿制作的是一个以往右下各偏移50dp为中心,长为50,宽为100的矩阵画椭圆.

canvas.drawOval(Rect.fromCenter(center: Offset(50, 50), width: 100, height: 50), _paint);

Flutter canvas 详解

drawArc

drawArc(Rect rect, double startAngle, double sweepAngle, bool useCenter, Paint paint) 能够制作圆弧.. 其间rect比较了解 这儿不赘述. startAngle便是制作的开始视点.这儿运用的是弧度制, 也便是0 -> 2pi. sweepAngle是扫过点视点, userCenter是是否衔接圆心. 这儿为了便利演示useCenter 的区别.需求改一下画笔的属性

    // 画笔的粗细
    _paint.strokeWidth = 5;
    // 画笔改成只画边缘不填充.这儿的区别便是圆弧是否填充
    _paint.style = PaintingStyle.stroke;
    canvas.drawArc(Rect.fromCircle(center: Offset(50, 50), radius: 50), 0, pi, true, _paint);

userCenter 为true:

Flutter canvas 详解

userCenter 为false:
Flutter canvas 详解

drawPaint

drawPaint(Paint paint) 即运用画笔填充画布色彩.比较简单不赘述.

Flutter canvas 详解

drawPath

drawPath(Path path, Paint paint) 能够经过路径去制作. 这儿算是比较重要也比较有用的一个属性,许多制作都会经过path办法去制作.咱们这儿采用制作三角形的办法来讲解它.

    Path path = Path();
    /// 首要移到原点
    path.moveTo(0, 0);
    /// 然后直线衔接到(0,100)
    path.lineTo(0, 100);
    /// 最终再衔接到(100,100)
    path.lineTo(100, 100);
    /// 最终衔接到原点闭合
    path.close();
    canvas.drawPath(path, _paint);

Flutter canvas 详解

drawPoints

drawPoints(PointMode pointMode, List points, Paint paint) 能够理解为点线图,其间pointMode包含三种:points、lines以及polygon.

  List<Offset> points = const [
      Offset(0, 0),
      Offset(10, 10),
      Offset(20, 20),
      Offset(30, 30),
      Offset(40, 40),
    ];
    canvas.drawPoints(PointMode.lines, points, _paint);

points:

Flutter canvas 详解
lines:
Flutter canvas 详解
polygon:
Flutter canvas 详解
咱们能够别离对比下,三种形式下制作的差别.简单来说, points形式会制作每个点.lines会取每两个点为一个线段,如果是奇数的话,则会疏忽最终一个点.polygon则是制作一条线段

drawText

drawText实际上不是canvas供给的api, 不过这儿也引进这个概念. 咱们需求创立TextPainter 目标,然后经过该目标去完成制作.

    TextPainter painter = TextPainter(
      text: TextSpan(
          text: '制作文字', style: TextStyle(color: Colors.black, fontSize: 20)),
      textDirection: TextDirection.ltr,
    )..layout();
    painter.paint(canvas, Offset.zero);

Flutter canvas 详解

other

实际上,canvas还包含了许多的api.包含制作Image、点九图、图集等等.这儿无妨自己做个测验.也算是一个家庭作业吧~ 一同尽力吧!骚年!!

源码

github.com/weniner/flu…

结语

这儿是WeninerIo,酷爱生活且酷爱游览.如果你对这次的分享感兴趣又或许有什么疑惑, 无妨谈论区留言 + 重视.等待下一次更好的相遇.