uniapp微信小程序 canvas绘制圆形半透明阴影 createCircularGradient函数不支持透明度部分解决方案

news2024/11/24 22:24:47

背景

我需要在微信小程序中,用canvas绘制一个圆形钟表,在ui设计图中,有一部分阴影,这里我节选一下:
图1
即深色发黑的部分

canvas通用阴影绘制

由于canvas中并不支持css那样简单的方式为圆形添加阴影或高光,于是我有了如下想法:

在下面绘制另一个带有黑色渐变效果的圆,在上面绘制原来的圆,这样圆看起来就有了影子,也就是单独给他画个影子出来

参见这篇BootWiki内容:微信小程序API gradient(如何绘制渐变效果)

以下是他提供的demo,由于背景色为白色,看不出来问题

在这里插入图片描述

这里借用他的图片,表达一下我们的想法:

在这里插入图片描述
这是不看起来就有影子了!
有了思路,这里我们付诸实践,代码大致如下

//阴影绘制 version1
const grdD = ctx.createCircularGradient(x坐标+5, y坐标+5,半径)  // 与原图形适当错开
		grdD.addColorStop(0, 'rgba(0,0,0,255)')  // 渐变起始值为纯黑不透明
		grdD.addColorStop(1, 'rgba(0)') // 渐变终点为纯黑纯透明
		ctx.setFillStyle(grdD) //固定用法
		ctx.fillRect(0, 0, canvasLength, canvasLength)//绘制范围,这里取了全图,后面会改

实际使用上效果不佳,根据实际绘制,诸君按需调整参数。温馨提示:addColorStop()函数可以添加多个。
我就因为阴影效果不理想,调整了addColorStop() 函数,如下

//阴影绘制 version2
const grdD = ctx.createCircularGradient(x坐标+5, y坐标+5,半径)  
		grdD.addColorStop(0, 'rgba(0,0,0,255)')  
		grdD.addColorStop(0.8, 'rgba(0,0,0,255)') // 在此处添加一个渐变节点
		grdD.addColorStop(1, 'rgba(0)') 
		ctx.setFillStyle(grdD) 
		ctx.fillRect(0, 0, canvasLength, canvasLength)

调整后的效果图
在这里插入图片描述
可以看到,我们实际上修改了渐变起始的位置,通过这种方式使边缘的色彩更加浓郁。避免直接渐变导致的外圈颜色过于浅淡。

但不能在微信小程序这样画

在使用官方 devtool 开发的时候,电脑端模拟器是完全支持这种形式的,但真机运行没有任何效果。(2024年8月6日)
经过我控制变量的测试,我发现这是因为真机小程序是不支持 rgba()形式定义颜色的。甚至也不支持 #000000FF 这种形式
在这里插入图片描述
而如果你使用 #000000FF 形式定义透明度,devtool 会直接报错,可是 rgba() 形式定义的颜色则是一个能运行,一个没效果。

尝试在微信端巧妙绘制

我们迎难而上,找了半天,没找到方案,于是决定不使用透明度。如果我直接使用当前底色作为渐变的终点色呢?
在这里插入图片描述
如图:白色底色实现参照组
我们不再使用 fillRect() 函数全图绘制,而是指定一个范围,并使用底色作为渐变终点,黑色作为渐变起点绘制阴影。
在这里插入图片描述
实现效果大致如此,此图为夸张表现
可以见得如果绘制的内容足够简单(没有背景色,或者背景色为纯色),那么只要梳理好绘制顺序,看到这里就够了。

但显然这种大开大合,外面套一个大正方形的绘制形式,实际应用场景有限。

最终方案

方案1(简单场景可用,即起始色为黑色画阴影的情况,或其他较深颜色):

这个方案其实可以放在前面说,因为真的简单,只需要将之前代码,渐变终点的颜色设置为 transparent 就可以了

grd.addColorStop(0, 'green')
grd.addColorStop(0.8, 'green')
grd.addColorStop(1, 'transparent') // 透明作为渐变终点

在这里插入图片描述

方案2(不完美,聊胜于无):

但说实话彩色的并不常见,常见的还是绘制黑色和白色,作为阴影或者高光使用。
但方案1不支持白色,为什么?请看图👇
在这里插入图片描述

//上图代码如下
grd.addColorStop(0, 'white')
grd.addColorStop(0.5, 'white')
grd.addColorStop(1, 'transparent')

怎么说呢,我就觉得这效果挺抽象的。。。

你说,能不能是这玩意对white的支持有问题,那么我写 #FFFFFF 行不行,或者近似颜色 #FFFFF0 呢?

能想到这一层我只能说真是个小机灵鬼,但没用,我试过了

grd.addColorStop(0, '#fefefe')
grd.addColorStop(0.8, '#dedede')//这两种颜色我分别试过了,这里放在一张图展示
grd.addColorStop(1, 'transparent')

在这里插入图片描述
后经测试,当白色程度超过约 #888888 的情况下,就会出现黑边问题,如图使用 #FFFF88较为明显
在这里插入图片描述
经查询,我发觉问题是: transparent 指代的是 rgba(0,0,0,0) 的值,也就是完全透明的黑色。但我们需要的是完全透明的白色。所以浅色下才会有一个同时向黑色和透明色过度的过程。暂时来看似乎没办法解决。

能切图还是切图!!!不要在这个功能上再浪费时间了!!!
这里给出一个凑合用的替代方案,即绘制半透明白色圆。半透明代码如下:

// 直接画个半透明白色圆替代
ctx.beginPath();
ctx.globalAlpha = 0.5 //调整全局画笔透明度
ctx.setStrokeStyle("white")
ctx.arc(outsideX, outsideY, outsideR, 0 * deg, 360 * deg)
ctx.setFillStyle("white")
ctx.fill()
ctx.stroke()
ctx.globalAlpha = 1//别忘了改回去

你也可以叠加多个半透明圆,但我还是建议你切图。

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

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

相关文章

Spring Boot 默认可以同时处理多少个请求?

微信中阅读,欢迎关注 CodeFit。 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注,为我的 持续创作 提供 动力! 解析 Spring Boot 的请求处理能力 目前,Spring Boot 是 Java 开发中不可或缺的框…

【大模型从入门到精通9】openAI API 提升机器推理:高级策略3

这里写目录标题 理论问题实践问题理论实践实践 理论问题 什么是链式思考推理(Chain of Thought Reasoning),它是如何增强人工智能模型在解决问题任务中的表现的? 链式思考推理提供的透明度如何使用户受益并建立对AI模型的信任&am…

基于python和aiohttp实现的web请求管理分发服务

想实现一个web请求管理分发服务,需要有如下功能: 1、第三方服务上报心跳,管理服务能监控第三方服务是否存活 2、管理服务支持http和ws服务的转发 3、管理服务支持最基础的转发策略,比方说轮询 直接上代码 一、网络和路由接口…

用AI助手写程序

用AI帮助写程序究竟靠不靠谱&#xff0c;下面来测试一下&#xff1a; 在文心一言中输入&#xff1a;写一个C Windows API串口通信程序。结果如下&#xff1a; #include <windows.h> #include <iostream> // 串口配置 void ConfigureCommPort(HANDLE hComm) {…

Linux系统的ARM边缘计算网关在纸张处理机械中的应用

数字化时代纸张处理机械行业也在不断追求智能化和高效化。ARM 边缘计算网关作为一种关键技术&#xff0c;为纸张处理机械的智能化提供了强大的支持。结合 Linux 系统的二次开发&#xff0c;它能够加速生产流程&#xff0c;提高生产效率和质量。 ARM 边缘计算网关具有强大的计算…

Python学习笔记50:游戏篇之外星人入侵(十一)

前言 本篇文章接着之前的内容&#xff0c;继续对游戏功能进行优化&#xff0c;主要是优化游戏状态以及对应的处理。 状态 一个游戏包含多种状态&#xff0c;这个状态是一个可以很复杂也可以很简单的内容。条件所限&#xff0c;我们这个游戏的状态就比较简单&#xff1a; 未…

log4j反序列化-流程分析

分析版本 JDK8u141 依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><ve…

三、1 一维数组的创建和初始化

数组是一组相同类型元素的集合 1、数组的创建 2、数组的初始化 在创建数组的同时&#xff0c;给数组内容一些合理的值 3、一维数组的使用 4、一维数组在内存中的存储 数组的内容在内存中连续存放

sqli靶场复现(1-8关)

目录 1.sqli-labs第二关 1.判断是否存在sql注入 1.1你输入数字值的ID作为参数&#xff0c;我们输入?id1 1.2在数据库可以查看到users下的对应内容 2.联合注入 2.1首先知道表格有几列&#xff0c;如果报错就是超过列数&#xff0c;如果显示正常就是没有超出列数。 2.2得…

模拟一次XFS故障,分析原因并进行修复

模拟一次XFS故障 在平常处理问题时经常会遇到文件系统损坏的问题&#xff0c;有时候是日志里面出现了报错但文件系统还是可以读写&#xff0c;有时候是文件系统已经无法读写了 分析下不同现象的原因和一些可能出现的情况。 通过直接修改块存储损坏文件系统 1、制作一个xfs文…

Pytorch基础模型,数据加载,优化算法

目录 一.nn.Module 二.优化器类 三.损失函数 四.在GPU上运行代码 五.常见的优化算法 1.梯度下降算法 2.动量法&#xff1a; 3.AdaGrad 4.RMSProp 六.Pytorch中的数据加载 1.数据集类 2.迭代数据集 2.Pytorch自带的数据集 一.nn.Module nn.Modul是torch.nn提供的一个…

嵌入式初学-C语言-十六

形式参数和实际参数 形式参数&#xff08;形参&#xff09; 函数定义时&#xff0c;指定的参数&#xff0c;形参是用来接收数据的&#xff0c;函数定义时&#xff0c;系统不会为形参申请内存&#xff0c;只有当函数调用时&#xff0c;系统才会为形参申请内存&#xff0c;用于存…

信息学奥赛初赛天天练-57-NOIP2018普及组-基础题1-输入输出设备、进制转换、计算机存储单位、 网络地理范围分类、等比数列求和

PDF文档公众号回复关键字:20240806 2019 CSP-J 基础题1 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 1 以下哪一种设备属于输出设备( ) A 扫描仪 B 键盘 C 鼠标 D 打印机 2 下列四个不同进制的…

PSTNET阅读

ICLR2021 点云序列在空间维度上具有不规则性和无序性&#xff0c;但在时间维度上具有规律性和有序性。 现有的基于网格的卷积不能直接应用于原始点云序列的时空建模。 在时空序列下&#xff0c;基于网格和基于点的卷积对比。 创新点 1.首次尝试在原始点云序列建模中分解空间…

serial靶机教程

靶机下载地址 https://download.vulnhub.com/serial/serial.zip 主机发现 arp-scan -l 端口扫描 nmap 192.168.229.131 -A 根据对⽐可知serial的⼀个ip地址为192.168.47.143 该靶机开启了22端⼝和80端⼝ 对⽹站进⾏⼀个访问&#xff0c;⼤概意思为这是对新的cookie处理程序…

【优秀python案例】基于python爬虫的深圳房价数据分析与可视化实现

现如今&#xff0c;房价问题一直处于风口浪尖&#xff0c;房价的上涨抑或下跌都牵动着整个社会的利益&#xff0c;即便是政府出台各种政策方针也只能是暂时抑制楼市的涨势&#xff0c;对于需要买房的人来说&#xff0c;除了关注这些变化和政策外&#xff0c;还有一个非常头疼的…

工具|阅读PDF时鼠标显示为小手中有向下箭头解决方法

由于工作中&#xff0c;会大量阅读PDF文档&#xff0c;如手册&#xff0c;规格书&#xff0c;各种图纸等&#xff0c;因此好用的PDF工具必不可少。我主要习惯用福昕阅读器&#xff0c;标注比较方便。 所以&#xff0c;本文主要以福昕阅读器为主&#xff0c;当然也适用于其他的阅…

linux文本处理命令:文本搜索工具grep详解

目录 一、概述 二、基本语法 1、语法 2、常用选项 3、获取帮助 三、示例 1. 搜索文件中的字符串 2. 忽略大小写搜索 3. 显示匹配行的行号 4. 反向搜索 5. 递归搜索 6. 使用扩展正则表达式 7. 列出包含匹配项的文件 8. 显示匹配行的上下文 9. 使用正则…

从2013数学建模B题碎纸片拼接问题看递归和迭代思想

目录 1.递归实例说明 2.迭代实例说明 3.迭代思想在碎纸片拼接赛题的运用 1.递归实例说明 斐波那契数列可以使用递归&#xff0c;也可以使用数列的通项公式&#xff0c;但是这个地方建议使用数列的通项公式&#xff0c;因为这个递归的深度过大这个结果很难运行出来&#xff1…

使用WebDAV共享本地文件,轻量易用

特征&#xff1a; 使用 Golang 实现&#xff0c;性能极高。 最终编译成单个二进制文件&#xff0c;不需要 Apache 或类似的环境&#xff0c;依赖性很少。 支持浏览器访问。 可以在同一个端口上启用多个 WebDAV 服务&#xff0c;每个服务具有不同的挂载目录、用户名和密码。 良好…