第三百七十七回

文章目录

  • 1. 概念介绍
  • 2. 实现方法
    • 2.1 maskFilter
    • 2.2 shader
  • 3. 代码与效果
    • 3.1 示例代码
    • 3.2 运行效果
  • 4. 内容总结

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

在这里插入图片描述

1. 概念介绍

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

2. 实现方法

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

2.1 maskFilter

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

2.2 shader

在创建画笔时,给画笔设置shader属性也可以创建出阴影效果,它和使用maskFilter属性创建出的阴影效果类似。我们可以使用RadialGradient的createShader
方法给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属性可以创建出渐变色的阴影效果;
  • 阴影效果的颜色,区域大小都可以通过组件的属性来控制;
    看官们,与"如何绘制阴影效果"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506075.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

索引使用规则6——单列索引联合索引

1、单列索引 单列索引&#xff1a;即一个索引只包含单个列 举个例子 1.1、给phone和那么建立索引 create index index_name on tb_qianzhui(name); create index index_phone on tb_qianzhui(phone);1.2、查询发现可能的索引有好几个&#xff0c;但是最终选择了phone的索引…

wy的leetcode刷题记录_Day80

wy的leetcode刷题记录_Day80 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2024-3-2 前言 目录 wy的leetcode刷题记录_Day80声明前言2368. 受限条件下可到达节点的数目题目介绍思路代码收获 92. 反转链表 II题目介绍思路代码收获 2368…

代码随想录day11(1)字符串:反转字符串中的单词 (leetcode151)

题目要求&#xff1a;给定一个字符串&#xff0c;将其中单词顺序反转&#xff0c;且每个单词之间有且仅有一个空格。 思路&#xff1a;因为本题没有限制空间复杂度&#xff0c;所以首先想到的是用split直接分割单词&#xff0c;然后将单词倒叙相加。 但如果想让空间复杂度为O…

内存的检测与排查

内存&#x1f40e;的检测与排查 文章目录 内存&#x1f40e;的检测与排查查杀Java Web filter型内存马0x01 内存马简历史0x02 查杀思路0x03 内存马的识别0x04 内存马的查杀 查杀Java Web filter型内存马 0x01 内存马简历史 其实内存马由来已久&#xff0c;早在17年n1nty师傅的…

一文解决Onlyfans年龄验证问题(小白必看)

前言&#xff1a;很多用户在 OnlyFans 添加信用卡时&#xff0c;出现了年龄验证问题导致操作失败。出现这个问题的原因一是用国内邮箱注册了&#xff0c;二是绑卡时的 IP 有问题&#xff0c;会导致年龄验证、无法支付 OnlyFans 等问题。下面是一些逐步验证的步骤&#xff0c;供…

2、事件机制、DOM操作、jquery对尺寸操作、jquery添加和删除

一、事件机制 1、事件源.事件类型(事件处理程序) $(this)中的this不能加引号 $(#box).click(function () {$(this).css(background-color,blue)//点击颜色变为蓝色 })2、事件源.on/bind(事件类型&#xff0c;事件处理程序) $("#box").on(dbclick,function () {$(…

什么是Vue指令?请列举一些常见的Vue指令以及它们的用法

Vue.js 是一款流行的前端框架&#xff0c;它的指令&#xff08;Directives&#xff09;是 Vue.js 提供的一种特殊属性&#xff0c;用于在模板中对 DOM 元素进行直接操作。指令通常是以 v- 开头的特殊属性&#xff0c;用于响应式地将数据绑定到 DOM 元素上。 在 Vue 中&#xf…

#WEB前端

1.实验&#xff1a;vscode安装&#xff0c;及HTML常用文本标签 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; &#xff08;1&#xff09;网页直接搜索安装vscode &#xff08;2&#xff09;打开vscode&#xff0c;在下图分别安装以下插件&#xff1a; Html Css Support …

机器学习:模型选择和模型优化

进行数据处理之后&#xff0c;我们得到了x_train和y_train&#xff0c;我们就可以用来进行回归或分类模型训练啦~ 一、模型选择 我们这里可能使用的是回归模型&#xff08;Regression&#xff09;&#xff0c;值得注意的是&#xff0c;回归和分类不分家。分类是预测离散值&…

【leetcode】用队列实现栈

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 点击查看题目 思路: 在做此题之前&#xff0c;我们先要实现队列&#xff0c;这在上个博客中已经写过&#…

浅析 explicit 关键字

浅析 explicit 关键字 文章目录 浅析 explicit 关键字前言案例剖析补充案例总结 前言 ​ C 提供了多种方式来实现类型转换和构造对象&#xff0c;然而&#xff0c;有时候这些方式会导致一些意想不到的结果&#xff0c;比如隐式转换和复制初始化。为了避免这些潜在的问题&#…

【兔子机器人】根据自身机器人参数修改simulink模型

关节电机 机体初始高度 &#xff01;&#xff01;&#xff01;接下来尝试修改各腿的坐标朝向