Flutter绘图组件之CustomPaint使用详解

作者:岛上码农 时间:2021-12-13 01:26:06 

简介

在有些场景中,我们会需要绘制一些高度定制化的组件,比如 UI 设计师给我们出了个难题 —— 弄一个奇形怪状的边框。看在 UI 设计师是一个漂亮小姐姐的份上,又不好意思说这个做不了(那样也很没面子)。这个时候我们就不能直接使用 Flutter 自带的那些组件了,而是需要手动绘制组件,那就会需要用到 CuntomPaint 组件。CustomPaint 组件和前端的 Canvas差不多,允许我们在一个画布上绘制各种元素,包括点、线、矩形、圆弧、文字、图片等等。

CustomPaint 介绍

CustomPaint是一个 Widget,其中有三个重要的参数:

CustomPaint(
 child: childWidget(),
 foregroundPainter: foregroundPainter(),
 painter: backgroundPainter(),
)

childCustomPaint的子组件;

painterforegroundPainter:都是 CustomPainter 类,用于定义 canvas 绘制的内容。区别在于,首先是执行 painter 的绘制指令。然后是在背景上渲染 child 子组件。最后,foregroundPainter 的内容会绘制在 child 上一层。

Flutter绘图组件之CustomPaint使用详解

CustomPainter提供了一个paint绘图方法供我们绘制图形,该方法携带canvassize两个参数,其中 canvas 是画布,size 是画布大小。canvas 提供了很多绘制图形的方法,比如绘制路径、矩形、圆形和线条等等。

CustomPainter 示例

有了上面的基础概念后,我们来一个简单的示例来演示三个参数的层级关系。我们在backgroundPainter 上绘制一个蓝色的正方形,然后传入一个原型图片组件作为 child,最后是在 foregroundPainter 上绘制一个半透明的红色圆形遮住一部分图片。最终实现效果如下图,这样我们可以很好地了解三个元素的关系。

Flutter绘图组件之CustomPaint使用详解

完整代码如下:

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

标签:Flutter,CustomPaint
0
投稿

猜你喜欢

  • 完美解决Android三星手机从图库选择照片旋转问题

    2023-10-11 00:32:53
  • 浅谈Java常见的排序算法

    2023-09-08 11:11:11
  • Nacos docker单机模式部署实现过程详解

    2021-05-27 01:07:28
  • SpringBoot实现MapperScan添加动态配置(占位符)

    2023-11-26 05:08:06
  • 从 JVM 中深入探究 Synchronized作用及原理

    2023-07-28 17:22:33
  • Java毕业设计实战之图片展览馆管理系统的实现

    2021-06-16 08:23:18
  • IDEA2022创建Maven Web项目教程(图文)

    2022-09-25 02:30:44
  • Java超详细分析@Autowired原理

    2023-11-25 05:37:44
  • Java中list.contains()的用法及拓展

    2022-11-06 21:04:59
  • Intellij IDEA 2018配置Java运行环境的方法步骤

    2023-06-08 09:56:50
  • Android 开发使用PopupWindow实现加载等待界面功能示例

    2023-03-26 07:51:36
  • JPA like 模糊查询 语法格式解析

    2022-06-16 20:43:42
  • java最新版本连接mysql失败的解决过程

    2022-05-21 17:29:58
  • Android开发应用第一步 安装及配置模拟器Genymotion

    2023-05-25 11:18:09
  • springcloud-gateway集成knife4j的示例详解

    2023-11-29 08:56:44
  • 基于JSON实现传输byte数组过程解析

    2021-11-23 05:07:21
  • C#代码设置开机启动示例

    2021-12-16 17:53:07
  • C#装饰者模式实例分析

    2022-07-16 00:33:53
  • springboot整合solr的方法详解

    2023-01-20 17:54:37
  • 通过java.util.TreeMap源码加强红黑树的理解

    2021-07-27 08:45:59
  • asp之家 软件编程 m.aspxhome.com