Flutter绘图组件之CustomPaint使用详解
作者:岛上码农 时间:2021-12-13 01:26:06
简介
在有些场景中,我们会需要绘制一些高度定制化的组件,比如 UI 设计师给我们出了个难题 —— 弄一个奇形怪状的边框。看在 UI 设计师是一个漂亮小姐姐的份上,又不好意思说这个做不了(那样也很没面子)。这个时候我们就不能直接使用 Flutter 自带的那些组件了,而是需要手动绘制组件,那就会需要用到 CuntomPaint
组件。CustomPaint
组件和前端的 Canvas
差不多,允许我们在一个画布上绘制各种元素,包括点、线、矩形、圆弧、文字、图片等等。
CustomPaint 介绍
CustomPaint
是一个 Widget,其中有三个重要的参数:
CustomPaint(
child: childWidget(),
foregroundPainter: foregroundPainter(),
painter: backgroundPainter(),
)
child
:CustomPaint
的子组件;
painter
和 foregroundPainter
:都是 CustomPainter
类,用于定义 canvas
绘制的内容。区别在于,首先是执行 painter
的绘制指令。然后是在背景上渲染 child
子组件。最后,foregroundPainter
的内容会绘制在 child
上一层。
CustomPainter
提供了一个paint绘图方法供我们绘制图形,该方法携带canvas
和size
两个参数,其中 canvas
是画布,size
是画布大小。canvas
提供了很多绘制图形的方法,比如绘制路径、矩形、圆形和线条等等。
CustomPainter 示例
有了上面的基础概念后,我们来一个简单的示例来演示三个参数的层级关系。我们在backgroundPainter
上绘制一个蓝色的正方形,然后传入一个原型图片组件作为 child
,最后是在 foregroundPainter
上绘制一个半透明的红色圆形遮住一部分图片。最终实现效果如下图,这样我们可以很好地了解三个元素的关系。
完整代码如下:
import 'dart:ui';
import 'package:flutter/material.dart';
class BasicPaintPage extends StatelessWidget {
const BasicPaintPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return CustomPaint(
child: Center(
child: ClipOval(
child: Image.asset(
'images/beauty.jpeg',
width: 200,
height: 200,
fit: BoxFit.fitWidth,
),
),
),
painter: BackgroundPainter(),
foregroundPainter: ForegroundPainter(),
);
}
}
class BackgroundPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
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 - 120, center.height - 120, 240, 240),
paint,
);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) {
return false;
}
}
class ForegroundPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
var center = size / 2;
var paint = Paint()..color = Color(0x80F53010);
paint.strokeWidth = 2.0;
canvas.drawCircle(
Offset(center.width, center.height),
100,
paint,
);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) {
return false;
}
}
其中在背景绘制中我们制定了canvas 的背景色,即下面这行代码:
canvas.drawColor(Color(0xFFF1F1F1), BlendMode.color);
其他代码就相对好理解了,BackgroundPainter
绘制了一个蓝色正方形,child
是一个居中的圆形图片,而 ForegroundPainter
则是在中间绘制了一个和圆形图片同等大小的,半透明的红色圆圈。于是就得到了我们想要的效果。
来源:https://juejin.cn/post/7072330519811194917
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
完美解决Android三星手机从图库选择照片旋转问题
浅谈Java常见的排序算法
![](https://img.aspxhome.com/file/2023/0/63640_0s.png)
Nacos docker单机模式部署实现过程详解
![](https://img.aspxhome.com/file/2023/9/95939_0s.png)
SpringBoot实现MapperScan添加动态配置(占位符)
从 JVM 中深入探究 Synchronized作用及原理
Java毕业设计实战之图片展览馆管理系统的实现
![](https://img.aspxhome.com/file/2023/1/62521_0s.jpg)
IDEA2022创建Maven Web项目教程(图文)
![](https://img.aspxhome.com/file/2023/9/108179_0s.jpg)
Java超详细分析@Autowired原理
![](https://img.aspxhome.com/file/2023/9/60059_0s.png)
Java中list.contains()的用法及拓展
![](https://img.aspxhome.com/file/2023/9/113199_0s.jpg)
Intellij IDEA 2018配置Java运行环境的方法步骤
![](https://img.aspxhome.com/file/2023/6/62456_0s.png)
Android 开发使用PopupWindow实现加载等待界面功能示例
![](https://img.aspxhome.com/file/2023/6/100646_0s.gif)
JPA like 模糊查询 语法格式解析
java最新版本连接mysql失败的解决过程
![](https://img.aspxhome.com/file/2023/2/64052_0s.png)
Android开发应用第一步 安装及配置模拟器Genymotion
![](https://img.aspxhome.com/file/2023/4/91004_0s.png)
springcloud-gateway集成knife4j的示例详解
![](https://img.aspxhome.com/file/2023/9/60789_0s.png)
基于JSON实现传输byte数组过程解析
![](https://img.aspxhome.com/file/2023/4/107554_0s.png)
C#代码设置开机启动示例
![](https://img.aspxhome.com/file/2023/1/108621_0s.jpg)
C#装饰者模式实例分析
springboot整合solr的方法详解
![](https://img.aspxhome.com/file/2023/0/61580_0s.png)
通过java.util.TreeMap源码加强红黑树的理解
![](https://img.aspxhome.com/file/2023/8/68548_0s.png)