当前位置:网站首页>使用 CustomPaint 绘制基本图形
使用 CustomPaint 绘制基本图形
2022-07-07 21:34:00 【岛上码农@公众号同名】
上一篇初识 Flutter 的绘图组件 — CustomPaint我们介绍了 CustomPaint
的基本概念和使用,可以看到 CustomPaint
其实和 前端的 Canvas
基本上是一样的,实际上前端 Canvas
支持的绘制方法 CustomPaint
都支持,毕竟 CustomPaint
其实也是基于 Canvas
实现的。本篇我们来介绍 CustomPaint
基本图形的绘制。
绘制矩形
绘制矩形比较简单,方法定义如下:
void drawRect(Rect rect, Paint paint)
其中 rect
为要绘制矩形,paint
即画笔配置对象。比如我们要水平居中绘制一个宽度200 x 120的矩形,可以使用如下代码:
canvas.drawColor(Color(0xFFF1F1F1), BlendMode.color);
var center = size / 2;
// 绘制矩形
var paint = Paint()..color = Color(0xFF2080E5);
paint.strokeWidth = 2.0;
canvas.drawRect(
Rect.fromLTWH(center.width - 100, 60, 200, 120),
paint,
);
paint
默认是实心填充的,如果要空闲填充,设置paint
对象的style
属性 为 PaintingStyle.stroke
即可。
绘制圆形
绘制圆形上一篇有介绍过,和绘制矩形类似,只是传入的参数是圆心位置,半径和 paint
对象。
canvas.drawCircle(
Offset(center.width - 80, 240),
40,
paint,
);
绘制椭圆
椭圆的尺寸是通过外接的矩形约束的,调用形式和绘制矩形相同。
canvas.drawOval(
Rect.fromLTWH(center.width, 200, 120, 80),
paint,
);
绘制任意形状
绘制任意形状通过 drawPath
实现,将所需要绘制的形状路径 使用 Path
对象构建即可。以画一个等边三角形为例,我们确定三个顶点的位置后,使用 Path
对象的 lineTo
方法将三个顶点连接起来即可。下面是实现代码:
// 使用 Path绘制三角形
Path trianglePath = Path();
// 空心绘制
paint.style = PaintingStyle.stroke;
trianglePath.moveTo(center.width - 30, 300);
trianglePath.lineTo(center.width + 30, 300);
trianglePath.lineTo(center.width, 352);
trianglePath.lineTo(center.width - 30, 300);
canvas.drawPath(trianglePath, paint);
绘制弧形
绘制弧形实际也是通过绘制椭圆实现的,只是通过控制绘制的角度来控制弧形绘制的范围。绘制弧形的方法定义如下:
void drawArc(Rect rect, double startAngle, double sweepAngle, bool useCenter, Paint paint)
其中 rect
就是椭圆尺寸的约束矩形,startAngle
是起始角度,sweepAngle
是绘制的角度范围。useCenter
表示是否到矩形中心点闭合,默认为 true
。即按顺时针方向。默认是从中心点到对应起始角度的点连直线绘制完指定角度范围后再连直线回到中心点。如果 useCenter
为 false
,那么就直接按弧线的起止点闭合,而不会回到中心点。下面是两种绘制的区别,左边是 useCenter
为 false
,右边是 useCenter
为 true
,其他参数都相同。 下面的代码是绘制弧形的示例代码:
canvas.drawArc(
Rect.fromLTWH(center.width - 60, 340, 120, 80),
0,
pi / 2,
false,
paint,
);
总结
本篇介绍了 CustomPaint 绘制基本图形的方法和示例,实际上 Flutter 的 Canvas 提供了很多其他绘制图形的方法,如绘制线条,绘制圆角矩形,绘制文本等等,有兴趣的可以参考官网的说明文档查看各个方法的使用。有了绘制基本图形的基础,我们就可以绘制一些有趣的图形了 —— UI 小姐姐交代的任务还没完成呢!
边栏推荐
- 大数据开源项目,一站式全自动化全生命周期运维管家ChengYing(承影)走向何方?
- Restore backup data on persistent volumes
- Cv2.resize function reports an error: error: (-215:assertion failed) func= 0 in function ‘cv::hal::resize‘
- The difference between NPM uninstall and RM direct deletion
- Code of "digital image processing principle and Practice (matlab version)" part2[easy to understand]
- Restapi version control strategy [eolink translation]
- gridView自己定义做时间排版「建议收藏」
- EasyUI date control emptying value
- Backup tidb cluster to persistent volume
- Song list 11111
猜你喜欢
Solve the problem of uni in uni app Request sent a post request without response.
How to make agile digital transformation strategy for manufacturing enterprises
What if the win11u disk does not display? Solution to failure of win11 plug-in USB flash disk
Solve the problem of using uni app mediaerror mediaerror errorcode -5
Google SEO external chain backlinks research tool recommendation
Tcp/ip protocol stack
Reinforcement learning - learning notes 9 | multi step TD target
双塔模型的最强出装,谷歌又开始玩起“老古董”了?
QT compile IOT management platform 39 alarm linkage
An overview of the latest research progress of "efficient deep segmentation of labels" at Shanghai Jiaotong University, which comprehensively expounds the deep segmentation methods of unsupervised, ro
随机推荐
Description of the difference between character varying and character in PostgreSQL database
Can I open a stock account directly online now? Is it safe?
QT compile IOT management platform 39 alarm linkage
Jerry's fast pairing does not support canceling pairing [article]
Preparing for the interview and sharing experience
Codeforces Round #275 (Div. 2) C – Diverse Permutation (构造)[通俗易懂]
Song list 11111
Addition, deletion, modification and query of sqlhelper
Jetty: configure connector [easy to understand]
Unity3d 4.3.4f1 execution project
Nine degree 1201 - traversal of binary sort number - binary sort tree "suggestions collection"
Virtual machine network configuration in VMWare
MIT6.S081-Lab9 FS [2021Fall]
FatMouse' Trade (Hangdian 1009)
Lingyun going to sea | saihe & Huawei cloud: jointly help the sustainable development of cross-border e-commerce industry
Use br to back up tidb cluster data to azure blob storage
MIT6.S081-Lab9 FS [2021Fall]
NVR硬盘录像机通过国标GB28181协议接入EasyCVR,设备通道信息不显示是什么原因?
【colmap】稀疏重建转为MVSNet格式输入
L'enregistreur de disque dur NVR est connecté à easycvr par le Protocole GB 28181. Quelle est la raison pour laquelle l'information sur le canal de l'appareil n'est pas affichée?