文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何利用Android实现光影流动特效

2023-07-02 14:50

关注

本篇内容主要讲解“如何利用Android实现光影流动特效”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用Android实现光影流动特效”吧!

MaskFilter 类简介

MaskFilter 类,顾名思义是遮罩过滤器,也就是在绘制过程中给图像加一层遮罩效果,这个遮罩效果是通过某种变换函数实现的。Flutter 官方文档的说明如下,可以看出其实就是对位图的颜色处理。

A mask filter to apply to shapes as they are painted. A mask filter is a function that takes a bitmap of color pixels, and returns another bitmap of color pixels. 遮罩过滤器应用于要绘制的形状,其实就是一个函数,接收一个彩色像素位图,然后返回另一个彩色像素位图。

在 Flutter 里面,目前只提供了一个 MaskFilter 的命名构造函数方式实例化,就是模糊效果。这个模糊效果和我们的图片模糊有点类似,也是使用高斯模糊,只是多了一个模糊样式参数。定义如下:

const MaskFilter.blur(  this._style,  this._sigma,)

关于这个方法的说明,为了便于理解,将官方的文档翻译如下:

Creates a mask filter that takes the shape being drawn and blurs it. This is commonly used to approximate shadows. The style argument controls the kind of effect to draw; The sigma argument controls the size of the effect. It is the standard deviation of the Gaussian blur to apply. The value must be greater than zero. The sigma corresponds to very roughly half the radius of the effect in pixels. A blur is an expensive operation and should therefore be used sparingly. The arguments must not be null. 创建一个遮罩过滤器将要绘制的形状进行模糊处理。通常用于实现近似阴影的效果。style 参数控制绘制的效果类型 (BlurStyle 枚举);sigma 参数控制效果的尺寸,实际就是使用的高斯模糊的标准差。sigma 的值必须大于0,这个值在像素上,大致是效果范围的半径值。模糊处理比较耗性能,因此要有节制地使用。

因为效果有点类似阴影,而且比较耗性能,因此如果仅仅是要绘制阴影的话,官方推荐是使用 Canvas 的 drawShadow 方法替代这个效果。

MaskFilter 的几种效果对比

看文档使用起来比较简单,我们来看看 MaskFilter 的几种不同的模糊样式的区别。模糊样式通过 style 参数控制,BlurStyle 枚举取值有以下四种。

看文档说明我们是体会不到具体的呈现效果的,我们绘制同一个图形的不同效果对比看看。

如何利用Android实现光影流动特效

outer 类型有点奇怪,中间掏空了,不过看上去还挺酷的。我画了一个不模糊的叠加上去,发现组合后的效果就和 solid 模式一样。

如何利用Android实现光影流动特效

上面绘制的代码如下。

@overridevoid paint(Canvas canvas, Size size) {  var paint = Paint();  paint.style = PaintingStyle.fill;  var center = Offset(size.width / 2, size.height / 2);  var radius = 80.0;  paint.color = Colors.blue[400]!;  paint.maskFilter = MaskFilter.blur(BlurStyle.outer, 20.0);  canvas.drawCircle(center, radius, paint);}

光影流动

通过绘制的效果发现,其实 MaskFilter 实现的效果有点像设计师给的各种发光效果,比如内发光、外发光。这时候,配合动画可以玩点有趣的东西了。

光影流动效果1

我们利用之前实现的全屏渐变色聊天气泡中的效果,通过动画控制一个圆形上下移动看看会有什么效果,感觉是一个彩色的光球在上升和下降。

如何利用Android实现光影流动特效

上面效果的实现代码如下,基本的逻辑如下:

void _drawMovingCircle(Canvas canvas, Size size, Paint paint) {  var radius = 80.0;  paint.shader = LinearGradient(    begin: Alignment.topCenter,    end: Alignment.bottomCenter,    colors: [      Colors.black87,      Colors.purple,      Colors.blue,      Colors.green,      Colors.yellow[500]!,      Colors.orange,      Colors.red[400]!    ].reversed.toList(),    tileMode: TileMode.clamp,    transform: GradientRotation(      animationValue * 2 * pi,    ),  ).createShader(Offset(0, 0) & size);  paint.maskFilter = MaskFilter.blur(BlurStyle.solid, 20.0);  canvas.drawCircle(      Offset(size.width / 2, size.height * animationValue), radius, paint);}

光影流动效果2

上面的效果是一个圆形的,我们换成多个并排的矩形来看看,这种效果感觉整个填充区域的颜色在不停流动变幻,就好像有霓虹灯照耀的感觉。

如何利用Android实现光影流动特效

上面效果的实现代码如下,其实就是通过循环绘制了一排矩形,然后通过动画控制上下移动位置。

void _drawMultiMovingRect(Canvas canvas, Size size, Paint paint) {  paint.shader = LinearGradient(    begin: Alignment.topCenter,    end: Alignment.bottomCenter,    colors: [      Colors.black87,      Colors.purple,      Colors.blue,      Colors.green,      Colors.yellow[500]!,      Colors.orange,      Colors.red[400]!    ].reversed.toList(),    tileMode: TileMode.clamp,    transform: GradientRotation(      animationValue * 2 * pi,    ),  ).createShader(Offset(0, 0) & size);  paint.maskFilter = MaskFilter.blur(BlurStyle.solid, 20.0);  var count = 10;  for (var i = 0; i < count + 1; ++i) {    canvas.drawRect(      Offset(size.width / count * i, size.height * animationValue) &          Size(size.width / count, size.width / count * 2),      paint,    );  }}

光影流动效果3

这一次我们使用 outer 类型的模糊效果,然后让一串圆形沿屏幕对角线从收起到展开,再从展开到收起,效果如下所示,光束球发出来的时候,感觉就像是从左上角发了一个大招。

如何利用Android实现光影流动特效

上面的实现代码如下所示,就是通过控制圆形的中心位置实现对角线移动的,间距则是随着动画值的增加而拉大,因此会有发射的效果。

void _drawMultiMovingCircle(Canvas canvas, Size size, Paint paint) {  paint.shader = LinearGradient(    begin: Alignment.topCenter,    end: Alignment.bottomCenter,    colors: [      Colors.black87,      Colors.purple,      Colors.blue,      Colors.green,      Colors.yellow[500]!,      Colors.orange,      Colors.red[400]!    ].reversed.toList(),    tileMode: TileMode.clamp,    transform: GradientRotation(      animationValue * 2 * pi,    ),  ).createShader(Offset(0, 0) & size);  paint.maskFilter = MaskFilter.blur(BlurStyle.outer, 20.0);  var count = 10;  for (var i = 0; i < count + 1; ++i) {    canvas.drawCircle(      Offset(size.width * i / count * animationValue,          size.height * i / count * animationValue),      size.width / count,      paint,    );  }}

光影流动效果4:光影沿贝塞尔曲线流动

我们来把图形通过贝塞尔曲线控制绘制位置,来画一组图形,就能够实现光影沿着贝塞尔曲线流动的效果了。这里我们沿着两条首尾相接的贝塞尔曲线,绘制了一组正方形,看起来就像光影在一个闭合的图形中来回穿梭一样。

如何利用Android实现光影流动特效

实现代码和之前的类似,只是矩形的位置通过贝塞尔曲线生成,如下所示。

void _drawRectsUsingBezier(Canvas canvas, Size size, Paint paint) {  paint.shader = LinearGradient(    begin: Alignment.topCenter,    end: Alignment.bottomCenter,    colors: [      Colors.black87,      Colors.purple,      Colors.blue,      Colors.green,      Colors.yellow[500]!,      Colors.orange,      Colors.red[400]!    ].reversed.toList(),    tileMode: TileMode.clamp,    transform: GradientRotation(      animationValue * 2 * pi,    ),  ).createShader(Offset(0, 0) & size);  paint.maskFilter = MaskFilter.blur(BlurStyle.outer, 2);  final height = 120.0;  var p0 = Offset(0, size.height / 2 + height);  var p1 = Offset(size.width / 4, size.height / 2 - height);  var p2 = Offset(size.width * 3 / 4, size.height / 2 + height);  var p3 = Offset(size.width, size.height / 2 - height);  var count = 150;  var squareSize = 20.0;  for (var t = 1; t <= count; t += 1) {    var curvePoint =        BezierUtil.get3OrderBezierPoint(p0, p1, p2, p3, t / count);    canvas.drawRect(      curvePoint & Size(squareSize, squareSize),      paint,    );  }  for (var t = 1; t <= count; t += 1) {    var curvePoint =        BezierUtil.get3OrderBezierPoint(p3, p1, p2, p0, t / count);    canvas.drawRect(      curvePoint & Size(squareSize, squareSize),      paint,    );  }}

到此,相信大家对“如何利用Android实现光影流动特效”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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