基于Flutter怎么制作一个心碎动画特效
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,这篇文章主要介绍了基于Flutter怎么制作一个心碎动画特效的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Flutter怎么制作一个心碎动画特效文章都会有所收获,下面
千家信息网最后更新 2025年11月10日基于Flutter怎么制作一个心碎动画特效
这篇文章主要介绍了基于Flutter怎么制作一个心碎动画特效的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Flutter怎么制作一个心碎动画特效文章都会有所收获,下面我们一起来看看吧。
效果图先上:

实现步骤
1、绘制一个心
首先我们使用两段三阶贝塞尔曲线制作一个心型,这里因为需要实现心碎的效果,所以我们需要将心的两段用两段路径path进行绘制出来,效果:
绘制代码:
canvas.translate(size.width / 2, size.height / 2);Paint paint = Paint();paint ..style = PaintingStyle.stroke ..strokeWidth = 2 ..color = Colors.black87;Path path = Path();path.moveTo(0, 0);path.cubicTo(-200, -80, -60, -240, 0, -140);path.close();Path path3 = Path();canvas.save();canvas.drawPath( path, paint ..color = Colors.red ..style = PaintingStyle.stroke);canvas.restore();path3.cubicTo(200, -80, 60, -240, 0, -140);path3.close();canvas.drawPath( path3, paint..color = Colors.black87);
2、绘制心的裂痕
我们看到心确实分成两半了,但是中间还缺少裂痕,接下来我们就绘制心碎的裂痕,也很简单,在两段路径path闭合前进行绘制线,效果:
绘制代码:
path.relativeLineTo(-10, 30);path.relativeLineTo(20, 5);path.relativeLineTo(-20, 30);path.relativeLineTo(20, 20);path.relativeLineTo(-10, 20);path.relativeLineTo(10, 10);path3.relativeLineTo(-10, 30);path3.relativeLineTo(20, 5);path3.relativeLineTo(-20, 30);path3.relativeLineTo(20, 20);path3.relativeLineTo(-10, 20);path3.relativeLineTo(10, 10);
OK,我们已经看到心已经有了裂痕,如何心碎,只需将画布进行翻转一定角度即可,这里我们将画布翻转45°,看下效果:
左边:
右边:
3、加入动画
已经有心碎的感觉了,接下来加入动画元素让心碎的过程动起来。
思路: 我们可以想一下,心碎的过程是什么样子,心的颜色慢慢变灰,心然后慢慢裂开,下方的动画运动曲线看起来更符合心碎的过程,里面有不舍,不甘,但最后心还是慢慢的碎了。
我们把画笔进行填充将这个动画加入进来看下最终效果。

是不是心碎了一地。
知识点: 这里我们需要找到红色和灰色的RGB色值,通过Color.fromRGBO(r, g, b, opacity)方法赋值颜色的色值。然后通过动画值改变RGB的值即可。 这里我使用的色值是:
红色:Color.fromRGBO(255, 0, 0, 1)灰色:Color.fromRGBO(169, 169, 169, 1)
完整代码
class XinSui extends StatefulWidget { const XinSui({Key? key}) : super(key: key); @override _XinSuiState createState() => _XinSuiState();}class _XinSuiState extends State with SingleTickerProviderStateMixin { late AnimationController _controller = AnimationController(vsync: this, duration: Duration(milliseconds: 4000)) ..repeat(); late CurvedAnimation cure = CurvedAnimation(parent: _controller, curve: Curves.bounceInOut); late Animation animation = Tween(begin: 0.0, end: 1.0).animate(cure); @override Widget build(BuildContext context) { return Container( child: CustomPaint( size: Size(double.infinity, double.infinity), painter: _XinSuiPainter(animation), ), ); } @override void dispose() { _controller.dispose(); super.dispose(); }}class _XinSuiPainter extends CustomPainter { Animation animation; _XinSuiPainter(this.animation) : super(repaint: animation); @override void paint(Canvas canvas, Size size) { canvas.translate(size.width / 2, size.height / 2); Paint paint = Paint(); paint ..style = PaintingStyle.stroke ..strokeWidth = 2 ..color = Colors.black87; Path path = Path(); path.moveTo(0, 0); path.cubicTo(-200, -80, -60, -240, 0, -140); path.relativeLineTo(-10, 30); path.relativeLineTo(20, 5); path.relativeLineTo(-20, 30); path.relativeLineTo(20, 20); path.relativeLineTo(-10, 20); path.relativeLineTo(10, 10); path.close(); Path path3 = Path(); canvas.save(); canvas.rotate(-pi / 4 * animation.value); canvas.drawPath( path, paint ..color = Colors.red ..color = Color.fromRGBO( 255 - (86 * animation.value).toInt(), (animation.value * 169).toInt(), (animation.value * 169).toInt(), 1) ..style = PaintingStyle.fill); canvas.restore(); path3.cubicTo(200, -80, 60, -240, 0, -140); path3.relativeLineTo(-10, 30); path3.relativeLineTo(20, 5); path3.relativeLineTo(-20, 30); path3.relativeLineTo(20, 20); path3.relativeLineTo(-10, 20); path3.relativeLineTo(10, 10); path3.close(); canvas.rotate(pi / 4 * animation.value); canvas.drawPath( path3,paint); } @override bool shouldRepaint(covariant _XinSuiPainter oldDelegate) { return oldDelegate.animation != animation; }} 关于"基于Flutter怎么制作一个心碎动画特效"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"基于Flutter怎么制作一个心碎动画特效"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
动画
效果
制作
特效
知识
裂痕
代码
过程
接下来
内容
曲线
灰色
画布
篇文章
红色
路径
颜色
价值
元素
只需
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
富拉尔基网络安全培训
怎么将项目部署到云服务器
阿里云服务器的安全如何保障
常州idc服务器哪个厂家质量好
网络安全专业从事
软件开发客户总改需求
软件开发的困境
荆州串口服务器厂家
宝塔怎么连接远程数据库
switch读取数据库
无锡网络营销软件开发供应
软件开发项目管理的几个方面
软件开发工程的方法不包括
食物代谢物数据库
网络技术的发展翻译
分组交换网络技术
中国教育网络技术
云主机没有数据库
深圳市服务器
数据库导入文件回车直接消失
宁夏数据库通用多路锁控板装备
服务器认证管理
数据库电影收藏表
软件开发语言选取
ip网络技术生长期
数据库中的每个表
沈阳东道网络技术公司
服务器管理软件怎么看
db2 跨数据库访问
数据库导入文件回车直接消失