第三百七十二回

文章目录

  • 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.mzph.cn/news/707572.shtml

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

相关文章

LeetCode刷题笔记之二叉树(三)

一、寻找特定节点 1. 404【左叶子之和】 题目&#xff1a; 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。代码&#xff1a; class Solution {public int sumOfLeftLeaves(TreeNode root) {//左叶子不止是最左边的叶子&#xff0c;而是二叉树中每个节点的左叶子…

java多线程并发实战,java高并发场景面试题

阶段一&#xff1a;筑基 Java基础掌握不牢&#xff0c;对于一个开发人员来说无疑是非常致命的。学习任何一个技术知识无疑不是从基础开始&#xff1b;在面试的时候&#xff0c;面试官无疑不是从基础开始拷问。 内容包括&#xff1a;Java概述、Java基本语法、Java 执行控制流程、…

html5盒子模型

1.边框的常用属性 border-color 属性 说明 示例 border-top-color 上边框颜色 border-top-color:#369; border-right-color 右边框颜色 border-right-color:#369; border-bottom-color 下边框颜色 border-bottom-color:#fae45b; border-left-color 左边框颜色…

java springmvc/springboot 项目通过HttpServletRequest对象获取请求体body工具类

请求 测试接口 获取到的 获取到打印出的json字符串里有空格这些&#xff0c;在json解析的时候正常解析为json对象了。 工具类代码 import lombok.extern.slf4j.Slf4j; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.we…

【前端开发】前端开发深度解析:HTML、CSS、JavaScript与Vue.js

一、HTML&#xff1a;构建网页的基石 1.1 简介 HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是一种用于创建网页的标准标记语言。它使用各种标签&#xff08;tags&#xff09;来描述网页上的内容&#xff0c;包括文本、图像、链接、视频…

类的继承extends以及super

类的继承 继承&#xff1a;基于父类的某个扩展&#xff0c;制定出一个新的子类&#xff0c;而这个子类可以继承父类的原有属性和方法 java是如何体现继承的特性的 平板电脑继承了台式机电脑所拥有的功能(如听音乐)的基础上&#xff0c;同时扩展出自己特殊的用途&#xff1a;如…

pikachu之xss获取键盘记录

前备知识 跨域 跨域&#xff08;Cross-Origin&#xff09;是指在互联网中&#xff0c;浏览器为了保护用户信息安全而实施的一种安全策略——同源策略&#xff08;Same-Origin Policy&#xff09;&#xff0c;即浏览器禁止一个域上的文档或者脚本&#xff08;如通过JavaScript发…

从零开始学习Netty - 学习笔记 -Netty入门-ChannelFuture

5.2.2.Channel Channel 的基本概念 在 Netty 中&#xff0c;Channel 是表示网络传输的开放连接的抽象。它提供了对不同种类网络传输的统一视图&#xff0c;比如 TCP 和 UDP。 Channel 的生命周期 Channel 的生命周期包括创建、激活、连接、读取、写入和关闭等阶段。Netty 中…

QT C++实战:实现用户登录页面及多个界面跳转

主要思路 一个登录界面&#xff0c;以管理员Or普通用户登录管理员&#xff1a;一个管理员的操作界面&#xff0c;可以把数据录入到数据库中。有返回登陆按钮&#xff0c;可以选择重新登陆&#xff08;管理员Or普通用户普通用户&#xff1a;一个主界面&#xff0c;负责展示视频…

【0267】pg内核初始化 process table(ProcGlobal、PROC_HDR、PGPROC)分析

1. 前言 在postmaster或standalone后端启动期间初始化全局进程表(global process table)。该过程由InitProcGlobal()完成,对于此函数: (1)还创建了支持所请求的后端数量所需的所有每个进程信号量。我们过去只在后端真正启动时才分配信号量,但这很糟糕,因为它会让Postg…

vue组件中data为什么必须是一个函数

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…

JVM-垃圾回收

一、概念 垃圾回收是JVM的堆中管理内存的一种办法。JVM会在特定条件下回收无用的对象占用的内存空间。 二、判断垃圾的方法 1、引用计数法 这种判断某一对象是否是垃圾的方法的原理是&#xff1a;记录某个对象被引用的次数&#xff0c;如果引用次数是0说明是垃圾。但是有漏…

GameObject类API学习

GameObject类 GameObject类是Unity场景中所有实体的基类。一个GameObject对象通常由多个组件组成&#xff0c;且至少含有一个Transform组件。 1、GameObject类实例属性 在GameObject类中&#xff0c;实例属性有activeSelf和activeInHierarchy。 activeSelf属性&#xff1a;…

Spring与SpringBoot入门

Spring入门 要使用Spring最起码需要引入两个依赖: <!-- Spring Core&#xff08;核心&#xff09; --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.20</version>…

Linux内核定时器ioctrl实现对Led灯的控制

一. 简介 前面文章学习了 Linux内核提供的定时器来实现 Led灯的定时亮灭。文章地址如下: Linux内核定时器实现Led灯的定时亮灭说明二-CSDN博客 本文学习通过 应用程序调用 驱动,从而实现对 Led灯的控制。具体实现 ioctrl函数的驱动代码,从而控制 Led灯。 二. Linux内核定…

Unity3D 光照计算方向与法线贴图详解

前言 在Unity3D中&#xff0c;光照计算方向与法线贴图是实现高质量光照效果的重要技术之一。本文将详细介绍光照计算方向与法线贴图的原理和实现方法&#xff0c;并给出相应的代码示例。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流…

密码学系列(四)——对称密码2

一、RC4 RC4&#xff08;Rivest Cipher 4&#xff09;是一种对称流密码算法&#xff0c;由Ron Rivest于1987年设计。它以其简单性和高速性而闻名&#xff0c;并广泛应用于网络通信和安全协议中。下面是对RC4的详细介绍&#xff1a; 密钥长度&#xff1a; RC4的密钥长度可变&am…

Git,GitHub与GitLab分别是什么?有什么关系和区别?

Git 定义&#xff1a;Git 是一个分布式版本控制系统&#xff0c;用于跟踪文件的变化&#xff0c;并协助多人协作开发软件项目。作用&#xff1a;Git 可以在本地存储完整的项目历史记录&#xff0c;并允许开发者在不同的分支上进行独立的开发&#xff0c;最后将它们合并到主干分…

GPT 的基础 - T(Transformer)

我们知道GPT的含义是&#xff1a; Generative - 生成下一个词 Pre-trained - 文本预训练 Transformer - 基于Transformer架构 我们看到Transformer模型是GPT的基础&#xff0c;这篇博客梳理了一下Transformer的知识点。 BERT: 用于语言理解。&#xff08;Transformer的Encoder…

九州金榜|父亲在教育中的作用及重要性

随着社会进步&#xff0c;对比以前教育&#xff0c;现在父亲在教育中的作用越来越明显&#xff0c;孩子的教育离不开父亲&#xff0c;父亲在孩子教育中有什么作用&#xff1f;重要性又是什么呢&#xff1f;下面九州金榜家庭教育就带大家一起分析一下作为父亲&#xff0c;在孩子…