Flutter 简化CustomPainter的绘制

文章目录

  • 前言
  • 一、为何简化?
    • 1、通常做法
      • (1)、绘制形状1
      • (2)、绘制形状2
      • (3)、界面显示
    • 2、简化
  • 二、完整代码
  • 三、使用示例
    • 1、绘制图形
    • 2、动态触发绘制
  • 总结


前言

使用Flutter做界面时,有时会需要需要自绘的控件,比如异形按钮或者显示视频,我们通常可以用CustomPainter实现。但是CustomPainter是一个抽象类,需要继承并实现绘制方法,才能进行绘制。本文对CustomPainter进行了一个简单的封装,简化绘制操作。


一、为何简化?

1、通常做法

继承CustomPainter,并在paint中实现绘制。

(1)、绘制形状1

my_custom_painter_ellipse.dart
在这里插入图片描述

(2)、绘制形状2

my_custom_painter_triangle.dart
在这里插入图片描述

CustomPaint中指定继承的CustomPainter

(3)、界面显示

page.dart
在这里插入图片描述

2、简化

有时候我们并不需要复杂的绘制,只是需要简单绘制一个图像或者填充颜色、或者测试图像混合,每次都需要新建一个文件,并继承实现一个类,是比较麻烦的,如果我们将paint变成一个回调方法,在控件build中直接编写绘制代码,那事情就方便很多了。
page2.dart
在这里插入图片描述


二、完整代码

simple_painter.dart

/// 创建人:  xin
/// 创建时间: 2024/5/1 11:34
/// 注释:    辅助绘制,直接通过参数传方法绘制
class SimplePainter extends CustomPainter {final void Function(Canvas canvas, Size size) onPaint;final bool Function(CustomPainter oldDelegate)? onShouldRepaint;const SimplePainter({required this.onPaint,this.onShouldRepaint,super.repaint,});void paint(Canvas canvas, Size size) {onPaint(canvas, size);}bool shouldRepaint(covariant CustomPainter oldDelegate) {return onShouldRepaint?.call(oldDelegate) ?? true;}
}

三、使用示例

1、绘制图形

class Page2 extends StatelessWidget {const Page2({super.key});Widget build(BuildContext context) {return Row(children: [CustomPaint(//绘制矩形painter: SimplePainter(onPaint: (Canvas canvas, Size size) {final paint = Paint();paint.color = Colors.black38;canvas.drawRect(Rect.fromLTWH(0, 0, size.width, size.height), paint);}),),],);}
}

2、动态触发绘制

class Page2 extends StatelessWidget {final ChangeNotifier _notifier = ChangeNotifier();Page2({super.key});Widget build(BuildContext context) {return Row(children: [CustomPaint(//绘制矩形painter: SimplePainter(repaint: _notifier,onPaint: (Canvas canvas, Size size) {final paint = Paint();paint.color = Colors.black38;canvas.drawRect(Rect.fromLTWH(0, 0, size.width, size.height), paint);}),),],);}//调用方法触发局部重绘,void trigglePaint() {_notifier.notifyListeners();}
}

总结

以上就是今天要讲的内容,本文实现SimplePainter主要目的还是在于方便使用,尤其是写测试代码需要验证某些功能时,新建类并继承是比较繁琐的,而且那种方式也是比较“重”的,本文提供方式则轻量很多且灵活性也比较大,即可以在buid中直接绘制,也可以把绘制封装在方法中再调用,又或者封装在类中在调用。

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

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

相关文章

Linux DMA-Buf驱动框架

一、DMABUF 框架 dmabuf 是一个驱动间共享buf 的机制,他的简单使用场景如下: 用户从DRM(显示驱动)申请一个dmabuf,把dmabuf 设置给GPU驱动,并启动GPU将数据输出到dmabuf,GPU输出完成后&#xf…

大数据实训项目(小麦种子)-02、实训项目整体功能介绍与演示

文章目录 前言界面及功能描述实现功能描述技术选型界面展示首页界面功能1:HDFS,选择文件上传文件详细步骤 功能2:MapReduce预处理数据功能3:Hbase存储小麦种子数据并查询前10条记录功能4:Hive分析原始csv文件数据并ech…

彻底卸载SQL Server,步骤

SQLServer是软件开发过程中经常会用到的软件,但是在使用过程中,可能会涉及到更换版本时,无论是低版本换为高版本,还是高版本换成低版本。都少不了需要先卸载再安装的步骤。如果卸载的时候没有删干净的场合,那么安装新的…

RTA_OS基础功能讲解 2.9-警报器

RTA_OS基础功能讲解 2.9-警报器 文章目录 RTA_OS基础功能讲解 2.9-警报器一、警报器简介二、警报器配置2.1 激活一个任务2.2 设置一个事件2.3 执行回调函数2.4 递增一个(软件)计数器三、警报器设置3.1 绝对警报3.1.1 单次触发3.1.2 周期触发3.1.3 在过去设置警报3.1.4 将绝对…

虚谷数据库-定时作业

虚谷数据库提供定时作业机制,用于定时、定期、自动的进行某些操作,可通过系统包 dbms_scheduler 进行定时作业创建、调度、查看、删除等。 DBMS_SCHEDULER 系统包封装了以下过程/函数:ENABLE、DISABLE、SET_JOB_ARGUMENT_VALUE、DROP_JOB、R…

swift微调牧歌数据电商多模态大语言模型

大规模中文多模态评测基准MUGE_数据集-阿里云天池多模态理解和生成评估挑战榜(MUGE)是由阿里巴巴达摩院智能计算实验室发起,由阿里云天池平台承办,并由浙江大学、清华大学等单位共同协办。 Mhttps://tianchi.aliyun.com/dataset/107332微调的是牧歌数据集,结果都不好,记录…

JDBC简介

JDBC最基本的知识点要求理解并会使用下边的两个案例即可: 前言: Jdbc操作步骤简析: 1.Connection connDriverManager.getConnection(url,账号,密码):用DriverManager类的连接方法根据url账号密码连接数据库&#xf…

中望CAD 2025 (ZW3D2025) 简体中文修改版

名称:中望CAD 2025 (ZW3D2025) 简体中文修改版 描述:一款三维CAD设计工具,运行破解补丁ZW3D2025-2024-Patch执行修补。 链接:夸克网盘分享 📁 大小:3.2GB 🏷 标签:#PC软件 #CAD #设…

支付宝 沙盒demo使用

简介:支付宝沙箱环境是一个为开发者提供的模拟测试环境,用于在应用上线前进行接口功能开发和联调。在这个环境中,开发者可以模拟开放接口,进行开发调试工作,以确保应用上线后能顺利运行。 1. 配置沙盒 1. 1 沙箱控制…

【odoo15】前端自定义模态弹窗

概要 在odoo15或者在15之前,odoo前端的owl框架还没完全替换当前前端框架的时候,我们很多时候都是用js或者jq来直接操作dom,那么我们如果需要在前端用到一个模态弹窗,可以怎么解决呢? 方法1 直接用js原生的模态弹窗&am…

Oracle的这些BUG你要遇到,说明你是一个DBA老鸟...

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…

采用卷积神经网络分类MNIST数据集与基础知识

卷积神经网络 (CNN) 分类 MNIST 数据集的基础知识 1. MNIST 数据集简介 MNIST(Modified National Institute of Standards and Technology)数据集是一个手写数字的图像数据库,用于机器学习领域中的图像分类任务。它包含60,000张训练图像和10,000张测试图像,图像大小为28x…

WED前端做什么:深度剖析与实用指南

WED前端做什么:深度剖析与实用指南 在当今数字化浪潮中,前端开发已成为互联网领域不可或缺的一部分。WED前端作为其中的关键角色,肩负着构建优质用户体验的重任。那么,WED前端具体做什么呢?本文将从四个方面、五个方面…

39python数据分析numpy基础之h5py读写数组数据到h5文件

1 python数据分析numpy基础之h5py读写数组数据到h5文件 HDF5(分层数据格式文件)是Hierarchical Data Format Version 5的缩写,是一种用于存储和管理大数据的文件格式。经历了20多年的发展,HDF格式的最新版本是HDF5,它包含了数据模型&#xf…

【LVGL】Guider 界面分析

文章目录 前言架构创建 UI切换界面空间释放分析创建页面空间变化 前言 分析Gui Guider-1.7.2-GA 生成的 LVGL 界面切换,资源管理等处理 架构 所有控件存放于同一个结构体 lv_ui 内,每个页面都至少包含 screen_xxx 和 screen_xxx_del 两个成员 typede…

用HAL库改写江科大的stm32入门-7-1 ADC

实验目的:了解ADC基本概念 电路图: ADC(Analog-Digital Converter)模拟-数字转换器,它可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。 实验效果: &#xff0…

【html】学会这一套布局,让你的网页更加

很多小伙伴们在刚刚开始学习网页设计的时候不知道怎么布局今天给大家介绍一种非常实用且更加专业的一种布局。 灵感来源: 小米官网 布局图; 实例效果图: 这是一个简单的HTML模板,包括头部、内容区域和底部。 头部部分包括一个分为左右两部分…

【代码随想录】【算法训练营】【第39天】 [62]不同路径 [63]不同路径II [343]整数拆分 [96]不同的二叉搜索树

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 39,周六,坚持不住了~ 题目详情 [62] 不同路径 题目描述 62 不同路径 解题思路 前提:每次只能向下或者向右移动一步 思路:动态规划&#xff0…

部署LVS-DR群集...

目录 最后一台主机(第四台) 本地yum源安装httpd(非必做) 继续开始从最后一台主机开始(第四台) 转第二台主机 转第三台主机 回第二台 上传 转第三台主机 上传 回第二台 转第三台 转第一台主机…

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.5 RTC设备编写与实现

1. 概述 上一章节我们已经在QEMU中添加了RTC设备,本章节我们就把RTC设备给移植进入kernel中运行起来,我们移植的Google goldfish_rtc设备,此IP已经在Linux kernel有了Driver,所以我们直接移植设备树即可。 RTC时钟是用来记录当前系统时间的;对于Linux系统来说,时间是一…