Android+Flutter实现彩虹图案的绘制

 更新时间:2022年11月30日 10:36:25   作者:WeninerIo  
彩虹,是气象中的一种光学现象,当太阳光照射到半空中的水滴,光线被折射及反射,在天空上形成拱形的七彩光谱。接下来,我们就自己手动绘制一下彩虹图案吧

闲暇时,又听到了这首歌. 抑郁质性格的人难免会惆怅,美好的东西转瞬即逝.不过谁叫咱们是程序员呢~ 这就安排上.整上一个想看就看的彩虹!

玩转彩虹

彩虹,是气象中的一种光学现象,当太阳光照射到半空中的水滴,光线被折射及反射,在天空上形成拱形的七彩光谱,由外圈至内圈呈红、橙、黄、绿、蓝、靛蓝、蓝紫七种颜色. 相信小伙伴们在大雨过后的不经意间都见过吧! 接下来,我们就自己手动绘制一下.一般这种, 我们都会分析一下绘制的步骤.

分析步骤

彩虹实际上就是7道拱桥型状的颜色堆积,绘制彩虹第一步我们不如先绘制一道拱桥形状的颜色块.也就是说, 本质上我们绘制一个半圆环即可解决问题.

绘制半圆环

在Flutter中, 半圆环都绘制有很多方法. 比如canvas中,有drawOval(rect,paint) 的方法,这种方法可以绘制出一整个圆环, 我们可以对它作切割即可. 不过这种方法不便利的是它控制不了圆环的进度, 有没有一种方法可以让我们自己去控制圆环绘制的进度呢? 答案就是Path, 好多伙伴们应该都对Path 有过或多或少都了解, 它不仅可以画直线、三角形、圆锥,更可以画优美的贝塞尔曲线. 这里我们调用它的acrTo(Rect rect, double startAngle, double sweepAngle, bool forceMoveTo) 方法, 它的参数:

rect: 给定一个矩形范围,在矩形范围中绘制弧形. 也就是我们如果是正方形的话,实际上绘制的便是一个圆形,如果是长方形的话最终产物就是椭圆形.

startAngle: 起始的角度

sweepAngle: 扫过的角度 实际上这里的坐标系和笛卡尔坐标系是一样的, 所以是从x轴开始算的, 也就是顺时针方向分别是0 -> pi/2 -> pi -> 3/2pi-> 2pi. 我们假设startAngle是0的话, sweepAngle为1/3pi, 那么最终的圆弧如图左示.

forceMoveTo: false的时候,添加一个线段开始于当前点,结束于弧的起点.true时为原点.

理论知识了解完毕以后,我们通过如下代码进行绘制试一下:

{
    Path path = Path();
    path.moveTo(-width, 0.0);
    path.arcTo(
      Rect.fromCenter(center: Offset.zero, width: width, height: width),
      -pi,
      pi,
      true,
    );
}

结果如图:

第一道圆弧已经出来了, 说明理论上这样做可行.

多道圆弧

一道圆弧既然可以了, 我们首先记录下彩虹的颜色

  final List<Color> colors = const [
    Color(0xFF8B00FF),
    Color(0xFF0000FF),
    Color(0xFF00FFFF),
    Color(0xFF00FF00),
    Color(0xFFFFFF00),
    Color(0xFFFF7F00),
    Color(0xFFFF0000),
  ];

记录好颜色后, 我们首先回顾一下. 刚刚一道圆弧是怎么绘制的呢? 通过path的arcTo()方法,起始在负x轴, 终止于x轴.也就是说我们重复的绘制上七道, 只需要半径不一样即可绘制出相互连接的颜色体.

    for (var color in colors) {
      _paint.color = color;
      // 绘制圆弧
      drawArc();
      canvas.drawPath(path, _paint);
      // width 为每到圆弧的半径
      width += widthStep;
    }

嗯~ 没错, 结果确实和意料的一样

但是,总觉得有些不完美. 彩虹似乎都是有光晕的吧~

添加光晕

好, 光晕说来这不就来了.实际上我们可以通过画笔绘制周围部分作模糊当作光晕的形成, 恰恰Paint的mastFilter 也提供了这个方法.

{
    _paint.maskFilter = const MaskFilter.blur(BlurStyle.solid, 6);
}

我们先简要分析一下MaskFilter.blur() 提供了参数有哪些用处吧~实际上也就是style和sigma.style控制最终绘制出来的效果.sigma控制效果的大小.这里我们使用BlurStyle.solid就可以绘制出光晕的效果

光晕也有了, 但是我感觉不够个性. 我希望它可以像扇子一样展开收起. 我们来看看怎么实现.

动画

实际上控制它的展开收起也就是在path中sweepAngle.我们最小扫过是0弧度,最大是pi. 我们控制了弧度变化也就控制了彩虹的展示大小.直接安排上repeat()动画

{
    AnimationController _controller = AnimationController(
      vsync: this,
      // 这里需要把最大值改成pi, 这样才会完全展开
      upperBound: pi,
      duration: const Duration(seconds: 2),
    );
    _controller.repeat(reverse: true);
}

结果如图:

源码:https://github.com/weniner/flutter_demo/blob/main/lib/rainbow/widget/rainbow.dart

到此这篇关于Android+Flutter实现彩虹图案的绘制的文章就介绍到这了,更多相关Android Flutter绘制彩虹内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android 使用Canvas在图片上绘制文字的方法

    Android 使用Canvas在图片上绘制文字的方法

    下面小编就为大家分享一篇Android 使用Canvas在图片上绘制文字的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Flutter Element概念简明分析

    Flutter Element概念简明分析

    Flutter 中 Element 作用的是作为中枢来管理和调度Widget和RenderObject,这里我们主要说一下RenderObjectWidget 来主要说一下Element 的生命周期,这里我删除了一些assert 的方法,方便查看
    2023-04-04
  • Android 使用 Scroller 实现平滑滚动功能的示例代码

    Android 使用 Scroller 实现平滑滚动功能的示例代码

    这篇文章主要介绍了Android 使用 Scroller 实现平滑滚动功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • android指定DatePickerDialog样式并不显示年的实现代码

    android指定DatePickerDialog样式并不显示年的实现代码

    下面小编就为大家带来一篇android指定DatePickerDialog样式并不显示年的实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,祝大家游戏愉快哦
    2016-08-08
  • Android 实现微信登录详解

    Android 实现微信登录详解

    本文主要介绍Android 微信登录分享朋友圈,这里给大家详细介绍了Android微信登录的详细流程,有需要的小伙伴可以参考下
    2016-07-07
  • Android实现点击获取验证码倒计时效果

    Android实现点击获取验证码倒计时效果

    这篇文章主要介绍了Android实现点击获取验证码倒计时效果,这种效果大家经常遇到,想知道如何实现的,请阅读本文
    2016-08-08
  • android虚拟键盘弹出遮挡登陆按钮问题的解决方法

    android虚拟键盘弹出遮挡登陆按钮问题的解决方法

    这篇文章主要介绍了android虚拟键盘弹出遮挡登陆按钮问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android 使用ViewPager实现左右循环滑动及轮播效果

    Android 使用ViewPager实现左右循环滑动及轮播效果

    ViewPager是一个常用的Android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验,接下来通过本文给大家介绍Android 使用ViewPager实现左右循环滑动及轮播效果,一起看看吧
    2017-02-02
  • Android Studio实现搜索栏

    Android Studio实现搜索栏

    这篇文章主要为大家详细介绍了Android Studio实现搜索栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Android带依赖树的aar是如何生成的(推荐)

    Android带依赖树的aar是如何生成的(推荐)

    这篇文章主要介绍了Android打带依赖树的aar的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01

最新评论