本文将带大家学习一下如何利用toast中的motion_toast组件实现一个流动的渐变色边框效果,文中的示例代码讲解详细,快跟随小编一起学习学习吧
前言
记得在介绍 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);
}
绘制出来的效果如下图所示。
然后是让渐变色流动起来,这里就需要动画了,通过动画控制渐变填充的角度,周而复始就能够形成不断流动的效果。这里还是要用到 LinearGradient 的transform 属性。Flutter 内置了一个GradientRotation旋转变换的类,正好可以进行角度变换实现角度控制,GradientRotation 接收一个角度值实现对渐变的角度控制,下面是0度和90度的对比图,可以看到0度到90度边框的渐变色起始位置正好是旋转了90度。
有了以上两个基础,我们通过一个 Animation 对象动画过程中的值来控制旋转角度就可以了。
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 参数,还可以实现一些有趣的效果。下面这个效果就和开篇那个效果有点接近了。
如果是画成圆圈边框的话,做 Loading 效果其实也不错。
源码已经提交至:绘图相关源码,文件名为:gradient_bound_demo.dart。
总结
本篇介绍了自定义绘制渐变色边框,并通过动画实现流动的效果,绘图加动画组合能够实现很多既有创意又有取的效果,大家也可以尝试一下看看有哪些有趣的玩法。
到此这篇关于Android实现流动的渐变色边框效果的文章就介绍到这了,更多相关Android渐变色边框内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:Android实现流动的渐变色边框效果
- 详解flutter engine 那些没被释放的东西 2022-12-04
- Flutter实现底部和顶部导航栏 2022-08-31
- 作为iOS开发,这道面试题你能答出来,说明你基础很OK! 2023-09-14
- Android studio实现动态背景页面 2023-05-23
- Android实现监听音量的变化 2023-03-30
- Android实现轮询的三种方式 2023-02-17
- iOS 对当前webView进行截屏的方法 2023-03-01
- Android MaterialButton使用实例详解(告别shape、selector) 2023-06-16
- SurfaceView播放视频发送弹幕并实现滚动歌词 2023-01-02
- 最好用的ios数据恢复软件:PhoneRescue for Mac 2023-09-14
