Flutter粒子生成演示

演示:

直接上代码:

import 'dart:math';
import 'dart:ui';import 'package:flutter/material.dart';
import 'package:kq_flutter_widgets/widgets/chart/ex/extension.dart';class ParticleView extends StatefulWidget {const ParticleView({super.key});@overrideState<StatefulWidget> createState() => ParticleViewState();
}class ParticleViewState extends State<ParticleView>with TickerProviderStateMixin {///动画最大值static double maxValue = 1000.0;late AnimationController controller;late Animation<double> animation;@overridevoid initState() {super.initState();controller =AnimationController(duration: const Duration(seconds: 1), vsync: this);animation = Tween(begin: 0.0, end: maxValue).animate(controller)..addListener(_animationListener);controller.repeat();}void _animationListener() {if (mounted) {setState(() {});}}@overrideWidget build(BuildContext context) {return LayoutBuilder(builder: (v1, v2) {Path path = Path();path.moveTo(50, 50);path.cubicTo(50, 50, 100, 300, 300, 400);return CustomPaint(size: Size(v2.maxWidth, v2.maxHeight),painter: Particle(path: path),);});}@overridevoid dispose() {controller.removeListener(_animationListener);controller.dispose();super.dispose();}
}class Particle extends CustomPainter {///点粒子,如果设置了点粒子,则只显示点粒子final Offset? point;///路径粒子,优先点粒子final Path? path;///粒子改变方式final ParticleChangeType type;///粒子的数量final int startNum;final int endNum;///粒子运行半径final int rr;///粒子大小半径final int r;///路径粒子密度,数值越大,密度越大final int pointDensity;Particle({this.path,this.type = ParticleChangeType.disappear,this.startNum = 100,this.endNum = 6,this.rr = 20,this.r = 1,this.point,this.pointDensity = 80,});@overridevoid paint(Canvas canvas, Size size) {if (point != null) {_bezierDraw(canvas, startNum, point!);} else if (path != null) {PathMetric? pathMetric1 = path!.computeMetric();if (pathMetric1 != null) {int length1 = pathMetric1.length.toInt();double diff = (startNum - endNum) / length1;if (length1 > pointDensity) {int gap = length1 ~/ pointDensity;if (gap == 0) {gap = 2;}for (int i = 0; i < length1.toInt(); i = i + gap) {int left = (startNum - diff * i).toInt();Tangent? tangent1 = pathMetric1.getTangentForOffset(i.toDouble());if (tangent1 != null) {Offset cur = tangent1.position;_bezierDraw(canvas, left, cur);}}} else {for (int i = 0; i < length1.toInt(); i++) {int left = (startNum - diff * i).toInt();Tangent? tangent1 = pathMetric1.getTangentForOffset(i.toDouble());if (tangent1 != null) {Offset cur = tangent1.position;_bezierDraw(canvas, left, cur);}}}}}}@overridebool shouldRepaint(covariant CustomPainter oldDelegate) {return true;}_bezierDraw(Canvas canvas, int left, Offset cur) {for (int j = 0; j < left; j++) {double mix = Random().nextDouble();int r = Random().nextInt(rr);double radians1 = j * 2 * pi / left;double x1 = r * cos(radians1) + cur.dx;double y1 = r * sin(radians1) + cur.dy;///计算出两点间中间点往上垂直两点距地的点的坐标//计算坐标系中起点与终点连线与x坐标的夹角的弧度值double radians2 = atan2(y1 - cur.dy, x1 - cur.dx);//根据三角函数计算出偏移点相对于起点为原的坐标系的X的坐标double centerOffsetPointX = cos(Random().nextInt(2) == 1? (45 * pi / 180 + radians2): (45 * pi / 180 - radians2)) *sqrt(2) *r /2;//根据三角函数计算出偏移点相对于起点为原的坐标系的Y的坐标double centerOffsetPointY = sin(Random().nextInt(2) == 1? (45 * pi / 180 + radians2): (45 * pi / 180 - radians2)) *sqrt(2) *r /2;///坐标系平移double moveX = centerOffsetPointX + cur.dx;double moveY = centerOffsetPointY + cur.dy;Path path2 = Path();path2.moveTo(cur.dx, cur.dy);path2.cubicTo(cur.dx, cur.dy, moveX, moveY, x1, y1);/*canvas.drawPath(path2,Paint()..color = Colors.redAccent..style = PaintingStyle.stroke,);*////画动画点PathMetric? pathMetric2 = path2.computeMetric();if (pathMetric2 != null) {double length2 = pathMetric2.length;Tangent? tangent2 = pathMetric2.getTangentForOffset(length2 * mix);if (tangent2 != null) {Offset cur2 = tangent2.position;canvas.drawCircle(Offset(cur2.dx, cur2.dy),(type == ParticleChangeType.stable? this.r: type == ParticleChangeType.disappear? this.r * (1 - mix): this.r * mix).toDouble(),Paint()..color = Colors.redAccent..maskFilter=const MaskFilter.blur(BlurStyle.normal, 2));}}}}
}///粒子运动的变换方式
enum ParticleChangeType {///稳定,粒子运动时大小不改变stable,///消散,由大到小消失不见disappear,///聚合,由小到大出现后直接消失together,
}

 主要思路:

利用flutter的画布绘图,随机根据Path生成一些点,然后绘制路径,然后绘制路径上每一个点往四周动画运动的小球,小球在运动到一定的距离后,会消失,周而复始,达到粒子生成与泯灭的效果。

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

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

相关文章

Vue 使用vue-cli构建SPA项目(超详细)

目录 一、什么是vue-cli 二&#xff0c;构建SPA项目 三、 运行SPA项目 前言&#xff1a; 在我们搭建SPA项目时候&#xff0c;我们必须去检查我们是否搭建好NodeJS环境 cmd窗口输入以下指令&#xff1a;去检查 node -v npm -v 一、什么是vue-cli Vue CLI&#xff08;Vu…

Qt/C++音视频开发53-本地摄像头推流/桌面推流/文件推流/监控推流等

一、前言 编写这个推流程序&#xff0c;最开始设计的时候是用视频文件推流&#xff0c;后面陆续增加了监控摄像头推流&#xff08;其实就是rtsp视频流&#xff09;、网络电台和视频推流&#xff08;一般是rtmp或者http开头m3u8结尾的视频流&#xff09;、本地摄像头推流&#…

短视频矩阵系统,短视频矩阵源码技术开发

开发短视频矩阵系统的源码需要以下步骤&#xff1a; 确定系统需求&#xff1a;根据客户的需求&#xff0c;确定系统的功能和特点&#xff0c;例如用户注册登录、视频上传、视频浏览、评论点赞等。 设计系统架构&#xff1a;根据系统需求&#xff0c;设计系统的整体架构&#x…

【Java 基础篇】Java同步代码块解决数据安全

多线程编程是现代应用程序开发中的常见需求&#xff0c;它可以提高程序的性能和响应能力。然而&#xff0c;多线程编程也带来了一个严重的问题&#xff1a;数据安全。在多线程环境下&#xff0c;多个线程同时访问和修改共享的数据可能导致数据不一致或损坏。为了解决这个问题&a…

【差旅游记】初见乌海湖

哈喽&#xff0c;大家好&#xff0c;我是雷工。 最近在乌海出差&#xff0c;有幸见到了传说中在沙漠中看海的“黄河明珠”——乌海湖。 前段时间一直有点忙&#xff0c;现在有点时间&#xff0c;趁还没忘光&#xff0c;简单整理记录下。 那是在上个月&#xff0c;2023年8月8号…

Flutter的路由router-页面跳转

文章目录 概念介绍基本路由&#xff08;Basic Routing&#xff09;跳转到某个页面弹出页面 命名路由&#xff08;Named Routing&#xff09;第三方路由管理库&#xff08;Third-Party Routing Libraries&#xff09; Android原生的路由Intent-based Routing&#xff08;基于Int…

【Spatial-Temporal Action Localization(七)】论文阅读2022年

文章目录 1. TubeR: Tubelet Transformer for Video Action Detection摘要和结论引言&#xff1a;针对痛点和贡献模型框架TubeR Encoder&#xff1a;TubeR Decoder&#xff1a;Task-Specific Heads&#xff1a; 2. Holistic Interaction Transformer Network for Action Detect…

stm32学习-芯片系列/选型/开发方式

【03】STM32HAL库开发-初识STM32 | STM概念、芯片分类、命名规则、选型 | STM32原理图设计、看数据手册、最小系统的组成 、STM32IO分配_小浪宝宝的博客-CSDN博客  STM32&#xff1a;ST是意法半导体&#xff0c;M是MCU/MPU&#xff0c;32是32位。  ST累计推出了&#xff1a…

七天学会C语言-第五天(函数)

1. 调用有参函数 有参函数是一种接受输入参数&#xff08;参数值&#xff09;并执行特定操作的函数。通过向函数传递参数&#xff0c;你可以将数据传递给函数&#xff0c;让函数处理这些数据并返回结果。 例1&#xff1a;编写一程序&#xff0c;要求用户输入4 个数字&#xf…

MYSQL存储引擎基础知识介绍

下面重点介绍几种常用的存储引擎,并对比各个存储引擎之间的区别&#xff0c;以帮助读者理解 不同存储引擎的使用方式。 MyISAM MyISAM是 MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键&#xff0c;其优势是访 问的速度快&#xff0c;对事务完整性没有要求或者以 SEL…

Postman应用——接口请求和响应(Get和Post请求)

文章目录 新增Request请求Get请求Post请求 Request请求响应Postman响应界面说明请求响应另存为示例&#xff08;模板&#xff09;Postman显示的响应数据清空请求响应数据保存到本地文件 这里只讲用的比较多的Get和Post请求方式&#xff0c;也可以遵循restful api接口规范&#…

laravel-admin联动选择展示时ueditor样式错乱

问题 录入内容时&#xff0c;根据资源类型&#xff0c;展示不同的需要录入的内容&#xff0c;很常见的功能&#xff0c;但是在切换时&#xff0c;编辑器一直出不来&#xff0c;如图&#xff1a; 代码如下&#xff1a; $form->radio(type, 资源类型)->when(2, function…

Leetcode152. 连续子数组的最大乘积

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。 测试用例的答案是一个 32…

基于51单片机多路DTH11温湿度检测控制系统

一、系统方案 1、本设计采用51单片机作为主控器。 2、DHT11采集温度度&#xff0c;支持3路温度度&#xff0c;液晶1602显示。 3、按键设置报警阀值。 4、系统声光报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 //初始化LCD*********…

本地项目上传至码云gitee

1、springboot-mgx是需要上传的项目 2、码云后台创建一个新的仓库 3、创建完成后&#xff0c;复制下来https链接&#xff0c;后面要用到。 4、进入项目要上传的文件中 5、对git进行初始化&#xff0c;git指令 git init 6、 上传项目至gitee &#xff08;1&#xff09;连接远…

大数据之-Flink学习笔记

Flink Apache Flink — 数据流上的有状态计算。 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算处理。 任何类型的数据都以事件流的形式生成。信用卡交易、传感器测量、机器日志或网站或移动应用程序 2上的用户交互&#xff0c;…

如何通过百度SEO优化提升网站排名(掌握基础概念,实现有效优化)

随着互联网的发展&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;成为了网站优化中不可或缺的一部分。在中国&#xff0c;百度搜索引擎占据着主导地位&#xff0c;因此掌握百度SEO概念和优化技巧对网站的排名和曝光非常重要。 百度SEO排名的6个有效方法&#xff1a; 首…

CTF —— 网络安全大赛(这不比王者好玩吗?)

前言 随着大数据、人工智能的发展&#xff0c;人们步入了新的时代&#xff0c;逐渐走上科技的巅峰。 \ ⚔科技是一把双刃剑&#xff0c;网络安全不容忽视&#xff0c;人们的隐私在大数据面前暴露无遗&#xff0c;账户被盗、资金损失、网络诈骗、隐私泄露&#xff0c;种种迹象…

PostgreSQL设置主键为自增

1、创建自增序列 CREATE SEQUENCE table_name_id_seq START 1; 2、设置字段默认值 字段默认值中设置 nextval(table_name_id_seq) 3、常用查询 -- 查询所有序列 select * from information_schema.sequences where sequence_schema public; -- 查询自增序列的当前值 select cu…

2023年浙工商MBA新生奖学金名单公布,如何看待?

浙工商MBA项目官方最新公布了2023年的非全日制新生奖学金名单&#xff0c;按照政策约定&#xff0c;共分为特等奖学金1名&#xff0c;一等奖学金10名&#xff0c;二等奖学金15名&#xff0c;三等奖学金30名&#xff0c;额度对应3万、1万、0.8万、0.5万不等&#xff0c;主要名单…