基于Flutter怎么制作一个心碎动画特效
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍了基于Flutter怎么制作一个心碎动画特效的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Flutter怎么制作一个心碎动画特效文章都会有所收获,下面
千家信息网最后更新 2025年01月19日基于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 Statewith 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安全错误
数据库的锁怎样保障安全
exo设计数据库
全城有哒网络技术有限公司
服务器不正常关机硬盘文件丢失
期货平台与软件开发
软件开发哪一块的工资高
方舟全公益服务器
网络安全治理相关问卷
戴尔服务器无法识别光驱
微服务多少台服务器
数据库哪使用了局部性原理
qq 聊天记录 服务器
进销存库存软件开发
软件开发相关的论坛
烟台有嘉互联网科技
数据库应用的课程综述
吉林推广软件开发计划
南京网络安全警察电话
怎样恢复服务器电视
车牌字符数据库模板
linux 服务器优化
期货平台与软件开发
毕业生在国企做软件开发
中国人民大学报刊数据库
怀疑服务器安全教程
哈尔滨国家网络安全竞赛答案
常德代驾软件开发公司
全文数据库的检索方法有哪些
梦幻第一个服务器
斗蟋蟀视频软件开发
孤岛危机数据库