第一百八十一回 如何绘制阴影效果


我们在上一章回中介绍了"两种阴影效果"相关的内容,本章回中将 介绍如何绘制阴影效果.闲话休提,让我们一起Talk Flutter吧。

1. 概念介绍

我们在上一章回中介绍的阴影效果都是在某个组件上绑定阴影效果,本质上是把组件和阴影效果组合在了一起。本章回将介绍如何在创建组件时让组件自带阴影效果,也就在绘制组件自身外观的同时绘制阴影效果。

2. 实现方法

绘制阴影效果主要是通过CustomPainter组件提供的画笔(Paint)实现,我们在画笔中添加阴影相关的配置,在使用画笔绘制组件时就可以画出带阴影效果的组件。给画笔配置阴影效果有两种方法,接下来我们分别介绍这两种配置方法:

2.1 maskFilter

在创建画笔时,给画笔设置maskFilter属性就会创建出发散效果,这种效果看上去就像是阴影。我们可以使用MaskFilter的blur()方法来给maskFilter属性赋值,该方法可以控制发散效果的样式和大小。这个大小值非常重要,通过该值可以控制阴影区域的大小。我们在后面的小节中将通过示例代码进行演示。

2.2 shader

在创建画笔时,给画笔设置shader属性也可以创建出阴影效果,它和使用maskFilter属性创建出的阴影效果类似。我们可以使用RadialGradientcreateShader方法给shader属性赋值。阴影的颜色,大小,效果范围都是通过RadialGradient组件的属性来控制,该组件中常用的属性如下:

  • center:主要用来控制阴影区域的中心位置;
  • radius:主要用来控制阴影区域的大小;
  • colors:主要用来控制阴影的颜色;

上面介绍的这三个属性中,我们重点介绍colors属性,该属性是一个List<color>类型,它可以存放多个颜色值,因此它可以创建带有渐变效果的阴影。此外,给shader属性赋值时还需要一个矩形区域,它的radious一起配合使用,主要用来控制阴影区域的大小,我们在后面的小节中将通过示例代码进行演示。

3. 代码与效果

3.1 示例代码

///在canvas绘制图像时,通过设置画笔的maskFilter来实现阴影效果
class DrawShadow extends CustomPainter {
  
  void paint(Canvas canvas, Size size) {

    ///通过maskFilter来添加发光效果,看上去就是阴影效果
    ///colorFilter通常用来给图像添加阴影效果,绘制图形时体现不出来它的效果
    ///这里创建的阴影使用了单一颜色
    Paint paintA = Paint()
      ..color = Colors.blue.withOpacity(1)
      // ..colorFilter = ColorFilter.mode(Colors.redAccent, BlendMode.dst)
      ..strokeWidth = 4
      ..style = PaintingStyle.fill
      ..maskFilter = const MaskFilter.blur(BlurStyle.solid, 20);

    ///这里创建的阴影使用了渐变颜色
    RadialGradient gradient = const RadialGradient(
      ///用来控制中间颜色的位置
      center: Alignment(-1, -1),

      ///用来控制中间颜色的区域大小,需要和rect一起控制才可以
      radius: 0.6,
      colors: [Colors.black, Colors.black, Colors.black38],
    );

    ///rect的长和宽需要和圆形的半径有关联,不能太大也不能太小
    Rect rect = const Rect.fromLTWH(0, 0, 100, 100);
    Paint paintB = Paint()
      ..strokeWidth = 4
      ..style = PaintingStyle.fill
      ..maskFilter = const MaskFilter.blur(BlurStyle.solid, 20)
      ..shader = gradient.createShader(rect);

    ///渐变色的阴影最好偏移为0,不然效果不明显
    Offset offsetA = const Offset(150, 0);
    Offset offsetB = const Offset(0, 0);

    canvas.drawCircle(offsetA, 60, paintA);
    canvas.drawCircle(offsetB, 60, paintB);
  }

  
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    // throw UnimplementedError();
    return true;
  }
}

上面介绍的示例代码中演示了创建阴影效果的两种方法,我们在代码中添加了相关的注释,方便大家理解代码。

3.2 运行效果

编译并且运行上面的代码,可以得到下面的运行效果图,图中包含两个圆形,这个是黑白渐变色的圆形,另外一个是纯蓝色的圆形,它们的边缘都带有阴影效果。此外,我建议大家自动动手去实战,通过调整阴影的颜色,大小等配置来创建不同的阴影效果。

在这里插入图片描述

4. 内容总结

最后,我们对本章回的内容做一个全面的总结:

  • 绘制阴影效果通过CustomPainter组件的Paint实现;
  • 使用Paint组件的maskFilter属性可以创建出纯色发散形状的阴影效果;
  • 使用Paint组件的shader属性可以创建出渐变色的阴影效果;
  • 阴影效果的颜色,区域大小都可以通过组件的属性来控制;

看官们,与"如何绘制阴影效果"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

  • 20
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值