Flutter 35: 图解自定义 View 之 Canvas (三)

      小菜继续学习 Canvas 的相关方法:

drawVertices 绘制顶点

      小菜上次没有整理 drawVertices 的绘制方法,这次补上;Vertice 即顶点,通过绘制多个顶点,在进行连线,多用于 3D 模型中;

      drawVertices 包括三个参数,第一个是顶点属性,根据不同属性线的连接方式也不同;第二个是混合模式,即线的颜色与背景色混合效果;第三个是画笔,小菜测试调整 Paint 线的粗细无法调整整体连线的粗细;

      小菜借用 A B C D E F G H I 顶点来简单介绍:

  1. VertexMode.triangles:每三个分割顶点相连,即 [A B C] [D E F] [G H I] 共 3 组;
  2. VertexMode.triangleStrip:每相邻的三个顶点相连,即 [A B C] [B C D] [C D E] [D E F] [E F G] [F G H] [G H I] 共 7 组;
  3. VertexMode.triangleFan:每相邻的两个顶点与首点相连,即 [A B C] [A C D] [A D E] [A E F] [A F G] [A G H] [A H I] 共 7 组;
canvas.drawVertices(
    Vertices(VertexMode.triangles, [
      Offset(30, 30), Offset(30, 60),Offset(60, 60),
      Offset(90, 60), Offset(120, 60), Offset(120, 30),
      Offset(60, 90), Offset(60, 120), Offset(90, 120),
    ]),
    BlendMode.colorBurn, Paint()..color = Colors.red);

canvas.drawVertices(
    Vertices(VertexMode.triangleStrip, [
      Offset(210, 30), Offset(210, 60), Offset(240, 60),
      Offset(270, 60), Offset(300, 60), Offset(300, 30),
      Offset(240, 90), Offset(240, 120), Offset(270, 120),
    ]),
    BlendMode.colorBurn, Paint()..color = Colors.green);

canvas.drawVertices(
    Vertices(VertexMode.triangleFan, [
      Offset(120, 150), Offset(120, 180), Offset(150, 180),
      Offset(180, 180), Offset(210, 180), Offset(210, 150),
      Offset(150, 210), Offset(150, 240), Offset(180, 240),
    ]),
    BlendMode.colorBurn, Paint()..color = Colors.blue);

画布操作

      小菜接下来介绍一下画布的基本操作,与 Android 很相似;

scale 缩放

      scale 即缩放效果,缩放的是画布大小,可以设置缩放倍数,且缩放倍数会叠加;

canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
// 缩放
canvas.scale(2);

canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
// 缩放
canvas.scale(0.25);

canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
translate 平移

      translate 即平移,平移的也是画布,并非画布中子元素,两个参数分别为水平方向和竖直方向距离;

canvas.drawLine(
    Offset(0, 0), Offset(60, 60),
    Paint()..color = Colors.red..strokeWidth = 2);
canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
// 平移
canvas.translate(30, 90);

canvas.drawLine(
    Offset(0, 0), Offset(0, Screen.height),
    Paint()..color = Colors.blueGrey..strokeWidth = 2);
canvas.drawLine(
    Offset(0, 0), Offset(Screen.width, 0),
    Paint()..color = Colors.blueGrey..strokeWidth = 2);
canvas.drawLine(
    Offset(0, 0), Offset(60, 60),
    Paint()..color = Colors.red..strokeWidth = 2);
canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0.style = PaintingStyle.stroke);
rotate 旋转

      rotate 即旋转,原点为屏幕左上角,小菜为了效果先将画布平移一部分到屏幕中间在进行旋转测试,注意参数并非角度而是对应的 PI 值;

canvas.drawLine(
    Offset(0, 0), Offset(60, 60),
    Paint()..color = Colors.red..strokeWidth = 2);
canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
// 以当前原点旋转 90 度
canvas.rotate(degToRad(90));

canvas.drawLine(
    Offset(0, 0), Offset(60, 60),
    Paint()..color = Colors.green..strokeWidth = 2);
canvas.drawRect(
    Rect.fromLTWH(60, 60, 90, 50),
    Paint()..color = Colors.green
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
skew 斜切

      skew 即斜切,两个参数为水平方向和竖直方向切度值,值为三角函数中的 tan 值,即 45 度时 tan 值为 1

canvas.drawRect(
    Rect.fromLTWH(60, 0, 90, 50),
    Paint()..color = Colors.red
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
// 水平方向斜近 30 度,竖直方向不变
canvas.skew(0.6, 0);

canvas.drawRect(
    Rect.fromLTWH(60, 0, 90, 50),
    Paint()..color = Colors.green
      ..strokeWidth = 2.0..style = PaintingStyle.stroke);
save/restore 保存/恢复

      save/savelayer 即保存当前画布,restore 即恢复当前画布,也可以理解为清空重新绘制;save/restore 可以多次,以栈的方式存储,可以通过进栈/出栈到当具体某一层;但是小菜测试时发现与 save/restore 需要成对出现,否则回报不匹配异常;

canvas.clipRect(Rect.fromLTWH(40, 40, Screen.width - 80, Screen.width - 80));
canvas.drawColor(Colors.green, BlendMode.srcIn);
// 保存画布1
canvas.save();

canvas.clipRect(
    Rect.fromLTWH(60, 60, Screen.width - 120, Screen.width - 120));
canvas.drawColor(Colors.grey, BlendMode.srcIn);
// 保存画布2
canvas.save();
canvas.clipRect(
    Rect.fromLTWH(80, 80, Screen.width - 160, Screen.width - 160));
canvas.drawColor(Colors.orange, BlendMode.srcIn);
//  canvas.save();
// 恢复画布1
canvas.restore();
// 恢复画布2
canvas.restore();
//  canvas.restore();
canvas.drawColor(Colors.blue, BlendMode.srcIn);


      Canvas 非常强大,还有很多研究不透彻的地方,小菜仍在不断学习,有错误的地方烦请多多指点!

来源:阿策小和尚

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,313评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,369评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,916评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,333评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,425评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,481评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,491评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,268评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,719评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,004评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,179评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,832评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,510评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,153评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,402评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,045评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,071评论 2 352

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,028评论 0 2
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,383评论 0 17
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 8,983评论 0 13
  • var navigator = navigator || {};var window = window || {}...
    DF_Sky阅读 1,242评论 0 0
  • 骄阳火息秋意至, 修木依翠, 又临九月十。 天沉光黯藏云日, 地湿风紧融身衣。 忽感恩师今非夕, 春蚕红矩, 寿逝...
    平林织烟阅读 260评论 0 2