持续创作,加速成长!这是我参与「日新计划 6 月更文挑战」的第2天,点击查看活动详情
前言
记得在介绍 motion_toast 一篇的时候,开篇有一张动图,边框是渐变色而且感觉是流动的。这个动效挺有趣的,当时也有人问怎么实现,经过上一篇《让你的聊天气泡丰富多彩!》后,有了实现思路了。

实现思路
首先要实现但是渐变色边框,这个其实可以参考上一篇的CustomPaint
的动效是什么渐变填充实现。绘制一个矩形边框,然后让渐变色的区域填充到矩形区域内就可以了。
void paint(Canvas canvas, Size size) { final rectWidth = 300.0, rectHeight = 100.0; Rect rect = Offset( size.width / 2 - rectWidth / 2, size.height / 2 - rectHeight / 2) & Size(rectWidth, rectHeight); final paint = Paint() ..shader = LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: colors, ), ).createShader(rect) ..style = PaintingStyle.stroke ..strokeWidth = 8.0; canvas.drawRect(rect, paint); }
绘制出来的效果canvas软件如下图所示。动效忍者

然后是让渐变色流动起来,这里就需要动画了,通过动画控制渐变填充的角度,周而复始就能够flutter是什么意思形成不断流动的效果。这里还是要用到 LinearGradient
的transform
属性。Flutter 内置了一个GradientfluttershyRotation
旋转变换的类,正好可以进行角度变换实现角度控制,Gradie源码网站ntRotation 接收一个角度值实现对渐变的fluttering角度控canvas英语制,下面是0度和90度的对比图,可以看到0度到90度边框的渐变色起始位置正好是旋转了90度。

有了以上两个基础,我们通过一个 Animatio动画片猫和老鼠n 对象动画过程中的值来控制旋转角度就可以了动效忍者ae视频特效制作。
void paint(Canvas canvas, Size size) { final rectWidth = 300.0, rectHeight = 100.0; Rect rect = Offset( size.width / 2 - rectWidth / 2, size.height / 2 - rectHeight / 2) & Size(rectWidth, rectHeight); final paint = Paint() ..shader = LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: colors, transform: GradientRotation( animation * 2 * pi, ), //改变 transform 值实现渐变旋转效果 ).createShader(rect) ..style = PaintingStyle.stroke ..strokeWidth = 8.0; canvas.drawRect(rect, paint); }
动画配置代码如下,2秒旋转一周,使用 Curves.linear
实现匀速旋转。
class _GradientBoundDemoState extends State<GradientBoundDemo>
with SingleTickerProviderStateMixin {
late Animation<double> animation;
late AnimationController controller;
@override
void initState() {
super.initState();
controller =
AnimationController(duration: const Duration(seconds: 2), vsync: this);
animation = Tween<double>(begin: 0, end: 1.0).animate(CurvedAnimation(
parent: controller,
curve: Curves.linear,
))
..addListener(() {
setState(() {});
});
controller.repeat();
}
//...
}
实现的效果如下所示。

调整一下颜色和 LinearGradient
的 begin
和 end
参数,还可以实现一些有趣的效果。下面这个效果就和动效忍者下载开篇那个效果有点接近了。

如果源码1688是画成圆圈边框的话,做 Loading 效果其实也不错。

源码已经提交至:绘图相关源码,文件名为:gradient_bound_demo.dart
。
总结
本篇介绍了自定义绘制渐变色边fluttering框,并通过动画canvas平台实现流动的效果,绘图加动画组合能够实现很多既有创意又有取的效果,大家也可以尝试一下看看有哪些有动效设计论文趣的玩法。
我是岛上码农,微信公众号同名,这是Flutter 入门与源码编辑器下载实战的专栏文章,提供体系化的 Flucanvas平台tter 学习文章。对应源码源码之家请看这里:Flutter 入门与实战专栏源码。如有问题可以加本人微信交流,微信号:
island-coder
。:fluttershy觉得有收获请点个赞鼓励一下!
:收藏文章,方便回看哦!
:评论交流,互相进步!
评论(0)