文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

前言

记得在介绍 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);
}

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

然后是让渐变色流动起来,这里就需要动画了,通过动画控制渐变填充的角度,周而复始就能够形成不断流动的效果。这里还是要用到 LinearGradienttransform 属性。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();
  }
  
  //...
}

实现的效果如下所示。

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

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

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

总结

本篇介绍了自定义绘制渐变色边框,并通过动画实现流动的效果,绘图加动画组合能够实现很多既有创意又有取的效果,大家也可以尝试一下看看有哪些有趣的玩法。

到此这篇关于Android实现流动的渐变色边框效果的文章就介绍到这了,更多相关Android渐变色边框内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯