软件编程
位置:首页>> 软件编程>> Android编程>> Android实现流动的渐变色边框效果

Android实现流动的渐变色边框效果

作者:岛上码农  发布时间:2023-06-28 08:24:13 

标签:Android,渐变,边框

前言

记得在介绍 motion_toast 一篇的时候,开篇有一张动图,边框是渐变色而且感觉是流动的。这个动效挺有趣的,当时也有人问怎么实现,经过上一篇《让你的聊天气泡丰富多彩!》后,有了实现思路了。

Android实现流动的渐变色边框效果

实现思路

首先要实现但是渐变色边框,这个其实可以参考上一篇的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);
}

绘制出来的效果如下图所示。

Android实现流动的渐变色边框效果

然后是让渐变色流动起来,这里就需要动画了,通过动画控制渐变填充的角度,周而复始就能够形成不断流动的效果。这里还是要用到 LinearGradienttransform 属性。Flutter 内置了一个GradientRotation旋转变换的类,正好可以进行角度变换实现角度控制,GradientRotation 接收一个角度值实现对渐变的角度控制,下面是0度和90度的对比图,可以看到0度到90度边框的渐变色起始位置正好是旋转了90度。

Android实现流动的渐变色边框效果

有了以上两个基础,我们通过一个 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();
 }

//...
}

实现的效果如下所示。

Android实现流动的渐变色边框效果

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

Android实现流动的渐变色边框效果

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

Android实现流动的渐变色边框效果

源码已经提交至:绘图相关源码,文件名为:gradient_bound_demo.dart

来源:https://juejin.cn/post/7109096764799451167

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com