Flutter 36: 图解自定义 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 非常强大,还有很多研究不透彻的地方,小菜仍在不断学习,有错误的地方烦请多多指点!

转载于:https://www.cnblogs.com/Free-Thinker/p/10824992.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员必知之浮点数运算原理详解

导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握。许多程序员都不清楚使用操作符比较float/double类型的话到底出现什么问题。 许多人使用float/double进行货币计算时经常会犯错。这篇文章是这一系列中的精华,所有的软件开发人员都应…

工程代码_Egret开发笔记(二)基础工程代码阅读

代码目录结构在Egret Wing中打开上一节中我们创建的项目工程,查看代码目录结构,Forward在如下图中标记了各个目录的及关键文件的用途。代码阅读理解接下来我们从web入口一步一步阅读初始代码。首先打开index.html文件,我们看到index文件内容如…

知晓云助力小程序开发

小程序开发遇到瓶颈虽然腾讯提供了小程序解决方案,https://cloud.tencent.com/solution/la。但是对于普通开发者或者小企业的开发人员来说,购买域名,网站备案、部署SSL证书,安装会话服务器。业务逻辑上要使用数据库,缓…

Cracer渗透-windows基础(系统目录,服务,端口,注册表)

系统目录C:\Windows\system32\config\SAM (保存系统密码) 无法正常修改,可以进入PE系统进行修改(先备份在清空)利用结束后,再将之前备份的恢复C:\Windows\System32\drivers\hosts(域名解析文件)hosts欺骗&a…

java--xml文件读取(SAX)

SAX解析原理: 使用Handler去逐个分析遇到的每一个节点 SAX方式解析步奏: 创建xml解析需要的handler(parser.parse(file,handler)) package com.imooc_xml.sax.handler;import java.util.ArrayList;import org.xml.sax.Attributes…

imp命令导入指定表_Sqoop 使用shell命令的各种参数的配置及使用方法

点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源本文作者:Sheep Sun本文链接:https://www.cnblogs.com/yangxusun9/p/12558683.html大数据技术与架构点击右侧关注,大数据开发领域最强公众号!暴走大数据点击…

ik分词和jieba分词哪个好_Pubseg:一种单双字串的BiLSTM中文分词工具

中文分词是中文自然语言处理中的重要的步骤,有一个更高精度的中文分词模型会显著提升文档分类、情感预测、社交媒体处理等任务的效果[1]。Pubseg是基于BiLSTM中文分词工具,基于ICWS2005PKU语料训练集训练而成,其优点在于在ICWS2005-PKU语料下…

小白做淘客店铺新玩法

微信淘客在朋友圈刷了将近两个月。有些大咖赚得盆满钵满,有些小白交了不少学费。有人日入几千几万,也有入不敷出。在此咖妹并没有褒贬之意,只是提醒大家,不光淘客如此,其他项目亦是如此,别人能做成功的项目…

python sum函数numpy_如何用numba加速python?

我把写好的markdown导入进来,但是没想到知乎的排版如此感人。如果对知乎排版不满想要看高清清爽版,请移步微信公众号原文 如何用numba加速python?同时欢迎关注前言说道现在最流行的语言,就不得不提python。可是python虽然容易上手…

[ZJOI2019]麻将

Luogu5279 , LOJ3042题意&#xff1a;给出初始13张手牌&#xff0c;求理论可以和牌的最小轮数的期望&#xff0e;定义和牌为&#xff1a;4句话1对乱将&#xff0c;不能有杠&#xff1b;七对 原始题解-shadowice 写得很好的题解 首先分析期望&#xff1a;\(<--\)所有和牌的步…

采样次数不同平均值不一样_不同的真石漆装饰效果也是不一样的

外墙真石漆真的是一件很好的产品&#xff0c;具有防火性、防水性、安全且环保、粘力强、永不褪色等特点&#xff0c;无疑是人们较好的选择&#xff0c;在很早之前就已经逐渐的取代了瓷砖和其他石材在人们心中的位置。真石漆的品种不止一种&#xff0c;按照装饰效果我们可以分为…

android项目方法数超过65536的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 当项目的总方法数超过65536个&#xff0c;运行在手机上&#xff0c;指不定会报找不到哪个文件的错。 我把项目的PullRefresh框架切换为SmartRefresh框架出现了方法数超过65536。 此文只是做一下笔记&#xff0c;不多做解…

python快乐数字怎么表达_Python经典面试题:这些面试题你会了吗?

前言什么&#xff1f;你要去找工作&#xff1f;先别急着找工作&#xff0c;先把下面的python面试题先给看了吧&#xff0c;不然你就只是去面试而不是找工作。话说不打没准备的仗&#xff0c;下面这些基本的面试题都不会你怎么可能找到工作呢&#xff1f;还是先把下面的东西1、P…

【swift学习笔记】三.使用xib自定义UITableViewCell

使用xib自定义tableviewCell看一下效果图 1.自定义列 新建一个xib文件 carTblCell&#xff0c;拖放一个UITableViewCell,再拖放一个图片和一个文本框到tableviewcell上 并给我们的xib一个标识 为了学习&#xff0c;我这里的xib和后台的class是分开建的。我们再建一个cocoa touc…

命令模式(Command Pattern)

1命令模式是一个高内聚的模式。定义如下&#xff1a;将一个请求封装成一个对象&#xff0c;从而让你使用不同的请求把客户端参数化&#xff0c;对请求排队或者记录请求日志&#xff0c;可以提供命令的撤销和恢复功能。 2.角色说明&#xff1a; ● Receive接收者角色 该角色就…

graphpad7.04多组比较p值_同是折线图为何你却这么优秀,这才是多组数据作图应该有的样子...

相信大家对Excel做折线图应该不陌生&#xff0c;在展示数据的时候&#xff0c;图表是一种最好的展示方法。但是经常会碰到一种尴尬的事情就是&#xff0c;当数据维多比较多的时候&#xff0c;做出的图表就会显得非常难看。今天我们就来学习一下&#xff0c;多组数据怎么做折线图…

linux 运行 chom,Hadoop安装-单节点/伪分布(2.7.3)

1&#xff0c;下载Hadoop目前在Ubuntu的软件库里面 没有发现Hadoop的压缩包&#xff0c;没猜错Hadoop不是可执行文件 只是一个压缩包吧&#xff01;所以我们只能自己到官网下载(http://hadoop.apache.org/releases.html)&#xff1b;在Apache社区中&#xff0c;下载软件的时候…

app之---豆果美食

1.抓包 2.代码 抓取&#xff1a; #!/usr/bin/env python # -*- coding: utf-8 -*- #author tom import requests from multiprocessing import Queue from handle_pymongo import mongo from concurrent.futures import ThreadPoolExecutorclass Douguo():def __init__(self):s…

语言坐标度分秒的换算_测量位置度说明

测量位置度说明位置度是限制被测要素的实际位置对理想位置变动量的指标。它的定位尺寸为理论正确尺寸。位置度公差在评定实际要素位置的正确性, 是依据图样上给定的理想位置。位置度包括点的位置度、线的位置度和面的位置度。[1] 点的位置度:如公差带前加S&#xffe0;&#xf…

OpenStack创建win7实例遇到的问题(尚未解决,求帮助)

原地址在这里&#xff1a;&#xff08;作者也是我&#xff0c;害羞&#xff09;http://www.aboutyun.com/forum.php?modviewthread&tid22898 小白经过两天尝试&#xff0c;用fuel部署好了OpenStack的云平台&#xff0c;接下来想在Compute节点上创建一个win7 实例&#xff…