【Flutter】【基础】CustomPaint 绘画功能(一)

news2024/11/28 12:49:47

在这里插入图片描述

功能:CustomPaint

  • 相当于在一个画布上面画画,可以自己绘制不同的颜色形状等
  • 在各种widget 或者是插件不能满足到需求的时候,可以自己定义一些形状

使用实例和代码:

CustomPaint: 能使你绘制的东西显示在你的ui 上面,
painter=》child=》oregroundPainter,foregroundPainter最外面的一层会覆盖painter,child 层里面的widget.

 return Container(
   //painter 绘制完成之后需要再CustomPaint 里面构建称为widget
   child: Center(
     child: CustomPaint(
       child: Icon(
         Icons.abc,
         size: 40,
         color: Colors.red,
       ),
       painter: MybackGroudnPaiter(), //最内一层
       //  child: ,//子组件,在中间
       foregroundPainter: ForegroundPainter(), //最外面一层,也是  CustomPainter
     ),
   ),
 );

CustomPainter 绘制

class MybackGroudnPaiter extends CustomPainter {
  
  void paint(Canvas canvas, Size size) {
    //canvas 画布,size 画布的尺寸
    //在这边绘制
    // canvas.drawColor(Colors.red, BlendMode.color);
    var centerp = size / 2;
    //定义画笔是什么颜色,样式,画笔的宽度
    var paint = Paint()
      ..color = Colors.teal
      ..style = PaintingStyle.fill
      ..strokeWidth = 2.0;
    canvas.drawRect(
        Rect.fromLTWH(centerp.width - 100, centerp.height - 100, 200, 200),
        paint);
  }

  
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return true;
  }
}

class ForegroundPainter extends CustomPainter {
  
  void paint(Canvas canvas, Size size) {
    var centerp = size / 2;
    //定义画笔是什么颜色,样式,画笔的宽度
    var paint = Paint()
      ..color = Colors.pink
      ..style = PaintingStyle.fill
      ..strokeWidth = 2.0;
    canvas.drawRect(
        Rect.fromLTWH(centerp.width - 130, centerp.height - 130, 200, 200),
        paint);
  }

  
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    // TODO: implement shouldRepaint
    return true;
  }
}

绘制完成之后显示的图片


绘画的能力

我们绘制1000个彩色点点,从上往下掉落,看看性能,没有任何的卡顿,真给力

import 'dart:math';
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.white,
        body: MyHomePage(
          title: 'jack ma',
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  final List<Snowflake> _snowflakes =
      List.generate(1000, (index) => Snowflake());

  
  void initState() {
    ;
    _controller =
        AnimationController(vsync: this, duration: const Duration(seconds: 5))
          ..repeat();
    super.initState();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
      child: SizedBox(
        width: double.infinity,
        height: double.infinity,
        child: AnimatedBuilder(
          animation: _controller,
          builder: (BuildContext context, Widget? child) {
            //一直在这边build,5s 动画运行时间
            for (var snow in _snowflakes) {
              snow.fall();
            }
            return CustomPaint(
              painter: MyPainter(_snowflakes),
            );
          },
        ),
      ),
    ));
  }
}

class MyPainter extends CustomPainter {
  final List<Snowflake> _snowflakes;
  MyPainter(this._snowflakes);

  
  void paint(Canvas canvas, Size size) {
    final whitePaint = Paint()..color = Colors.grey;

    for (int i = 0; i < 1000; i++) {
      whitePaint.color = Colors.primaries[i % Colors.primaries.length];
      canvas.drawCircle(Offset(_snowflakes[i].x, _snowflakes[i].y),
          _snowflakes[i].radius, whitePaint);
    }
  }

  
  bool shouldRepaint(covariant CustomPainter oldDelegate) => true;
}

class Snowflake {
  double x = Random().nextDouble() * 400;
  double y = Random().nextDouble() * 800;
  double radius = Random().nextDouble() * 2 + 2;
  double velocity = Random().nextDouble() * 4 + 2;
  void fall() {
    y += velocity;
    if (y > 800) {
      y = 0;
      x = Random().nextDouble() * 400;
      radius = Random().nextDouble() * 2 + 2;
      velocity = Random().nextDouble() * 4 + 2;
    }
  }
}

在这里插入图片描述

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

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

相关文章

Mapbox加载天地图CGCS2000矢量瓦片地图

1.背景 最近在做天地图的项目&#xff0c;要基于MapBox添加CGCS2000矢量切片数据&#xff0c;但是 Mapbox 只支持web 墨卡托&#xff08;3857&#xff09;坐标系的数据。Github有专业用户修改了mapbox-gl的相关代码&#xff0c;支持CGCS2000的切片数据加载&#xff0c;并且修改…

idea添加作者信息

idea添加作者信息 在idea中&#xff0c;经常会有这些波浪纹提示&#xff0c;放在上面之后会提示添加作者信息,点击添加作者信息后&#xff0c;但是不是自己想要的 这里提取的话好像没什么办法修改&#xff0c;可能修改电脑的名称。这样提取出来才是自己需要的 自定义作者信息…

基于Java+SpringBoot+Vue的网上书城管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

CSS:background 复合属性详解(用法 + 例子 + 效果)

目录 background 复合属性background-color 背景颜色&#xff08;纯&#xff09;background-image 背景图片 或者 渐变颜色background-repeat 背景是否重复background-size 设置图片大小background-position 设置背景图片显示位置background-attachment 设置背景图片是否随页面…

软件包管理

一、rpm管理软件包 1、获得rpm的软件包 1&#xff09;去官网安装不推荐 找自己光盘有没有这个包 装好需要的包之后装qq 2&#xff09;去镜像站点&#xff0c;推荐 二、yum/dnf管理软件包 解决软件的依赖关系&#xff0c;可以自动的去服务器下载软件包 1、使用yum软件包 使用…

clion run qt 问题汇总

一、Error copying file “D:/soft/QT/5.15.2/mingw81_64/bin/Qt5Cored.dll” to “D:/work/Ccode/qtproject/cmake-build-debug-qtmingw”.报错 查看路径下确实没有Qt5Cored.dll&#xff0c;只有Qt5Core.dll 注释掉cmakelist中的这三行 重新执行后成功 二、使用CLion编辑u…

【Autolayout案例02-距离四周边距 Objective-C语言】

一、好,来看第二个案例 1.第二个案例,是什么意思呢,第二个案例,要求屏幕中间,有一个UIView UIView,是个红色的UIView UIView的大小,我不限定 但是无论你是什么屏幕下 这个UIView距离上边,始终是50 距离右边,始终是50, 距离下边,始终是50, 距离左边,始终是5…

【运维工程师学习八】代理及安装配置Nginx反向代理

【运维工程师学习八】代理 正向代理一、使用正向代理的主要作用有&#xff1a;二、反向代理三、使用反向代理的主要作用有&#xff1a;四、透明代理五、各种代理的主要区别六、Nginx的安装七、了解nginx的文件位置八、了解nginx程序的命令行参数九、开启nginx反向代理十、解读n…

变频谐振耐压试验装置产品概述及特点

一、产品概述 KDXZ-II 75kVA/75kV串联谐振耐压试验装置主要针10kV电缆及以下电力主变压器、母线开关等所有电气主设备的交流耐压试验设计制造。电抗器采用多只分开设计&#xff0c;既可满足高电压、小电流的设备试验条件要求&#xff0c;又能满足象10kV电缆这样的低电压的交流…

机器学习——SVM核函数

核函数这块&#xff0c;原理理解起来&#xff0c;相对比较简单 但还是会有一些不太理解的地方 对于非线性可分的数据而言&#xff0c;在当前维度&#xff0c;直接使用SVM有分不出的情况 那么就可以从当前维度&#xff0c;直接升到更高维度&#xff0c;进行计算。 例如原本数…

pytest fixture 高级使用

一、fixture中调用fixture 举例&#xff1a; 输出&#xff1a; 说明&#xff1a;登录fixture 作为参数传递到登出方法中&#xff0c;登录方法的返回值就可以被登出方法使用 二、在fixture中多参数的传递&#xff08;通过被调用函数传参&#xff09; 举例&#xff1a; 输出&a…

我的5年创作纪念日

CSDN的5周年来信 机缘 初心是什么&#xff1f;初心就是自己最初成为创作者的动力和目标。作为一个程序员&#xff0c;我对编程充满了热情和执着。我在实战项目中积累了丰富的经验&#xff0c;并希望能将这些经验分享给更多的人。通过写博客&#xff0c;我可以记录下日常学习的…

来的真快:微信小程序必须要备案,否则下架

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 随着上面的一声令下(工信部要求所有APP、小程序进行备案)&#xff0c;各大互联网大厂都开始实施具体政策了。来的可真快啊! 首先来的就是微信公众号&#xff0c;它是跟进政策是最快的了。微信公众…

搭建一个自己的文档网站

目录 简介 快速上手 配置 首页 组件Demo案例 简介 有时候我们可能很好奇&#xff0c;像elementUi或者vue3他们的文档网站是怎么写的&#xff0c;其实写vue文档网站的技术&#xff0c;有两个&#xff1a;一个是vuePress&#xff0c;一个是vitePress。从名字上可以看出来&#…

百度chatgpt内测版

搜索AI伙伴 申请到了百度的chatgpt&#xff1a; 完整的窗口布局&#xff1a; 三个哲学问题&#xff1a; 灵感中心&#xff1a; 请做一副画&#xff0c;一个渔夫&#xff0c;冬天&#xff0c;下着大雪&#xff0c;在船上为了一家的生计在钓鱼&#xff0c;远处的山上也都是白雪&a…

系列七、RocketMQ如何保证顺序消费消息

一、概述 所谓顺序消费指的是可以按照消息的发送顺序来进行消费。例如一笔订单产生了3条消息&#xff0c;即下订单》减库存》增加订单&#xff0c;消费时要按照顺序消费才有意义&#xff0c;要不然就乱套了&#xff08;PS&#xff1a;你总不能订单还没下&#xff0c;就开始减库…

备战金九银十之 5分钟带你掌握 Linux 的三种搜索方式

1.find 命令 find 命令是用来在给定的目录下查找符合给定条件的文件 语法格式&#xff1a;find [查找起始路径] [查找条件] [处理动作] &#xff08;1&#xff09;根据名称查找&#xff1a;find [查找起始路径] -name 文件名 或者 find [查找起始路径] -iname 文件名 -name …

超低功耗在智能门锁行业的应用

1. 名词解释 在本体上以电子方式识别、处理人体生物特征信息、电子信息、网络通讯信息等并控制机械执行机构实施启闭的门锁”叫电子智能门锁。通俗地理解&#xff0c;智能门锁是电子信息技术与机械技术相结合的全新的锁具品类&#xff0c;是在传统机械锁基础上升级改进的&…

C++学习| MFC简单入门

前言&#xff1a;因为接手了CMFC的程序&#xff0c;所以需要对MFC编程方面有所了解。 C之MFC简单入门 MFC相关的概念MFCWIN32QT MFC项目基本操作MFC项目创建MFC项目文件解读界面和代码数据交互——加法器 MFC相关的概念 MFC MFC&#xff08;Microsoft Foundation Classes微软…

【独立版】多商家+供应链云仓系统源码

详情介绍【独立版】多商家供应链云仓系统源码