canvas自定义绘制顺序解决遮挡问题

前言

大家好,我是南木元元,热衷分享有趣实用的文章。最近在做项目使用canvas绘图的时候遇到了一个问题,这里就分享出来并说一说自己的解决思路。

问题场景

项目中需要用canvas绘制多个要素,并且这几个要素要同时叠加在同一个canvas上,但这时出现了不是按照代码的顺序显示,即先绘制的显示在下面,后绘制的显示在上面。现在想要在canvas同一个区域同时叠加绘制如下四个要素:

  • 矩形网格(600 × 600)

在这里插入图片描述

  • 红色图形(400 × 400)
    在这里插入图片描述
  • 绿色图形(200 × 200)
    在这里插入图片描述
  • 蓝色线条
    在这里插入图片描述

按照上面的顺序依次进行绘制,但是,却出现了下面的效果。
在这里插入图片描述
上图中,是先绘制了矩形网格,然后绘制蓝色线条和绿色图形,最后绘制的红色图形,所以出现了绿色图形和蓝色线条被后绘制的红色部分遮挡的问题。

问题分析和解决思路

既然出现了上述问题,那必然是先执行了绘制蓝色线条和绿色图形的函数,最后再执行绘制红色图形的函数,导致的遮挡。

  • 那为什么会出现这样的问题呢?

仔细思考了下,由于每个要素我都是采取异步绘制的方式,但由于图片大小不同导致绘制或加载的时间不一样,那么就会导致先加载完的先画,后加载完的后画,就不是按照自己想要的顺序进行绘制了,于是就产生了遮挡问题。既然找出了问题,那么,如何解决这个问题,使得要素之间不发生遮挡,按照自己想要的顺序进行绘制呢?

  • 控制函数的执行顺序

通过函数数组的方式。定义一个数组,用来保存所有绘制元素的方法函数,这样就可以通过数组方法来操作这些函数,然后对函数按照我们自己想要的顺序进行排序,先执行的放前面,后执行的放后面,最后再遍历数组依次执行其中的每个绘制方法即可。

解决代码

接下来就开始动手实现一下上面的思路。

  • 自定义绘制顺序。
const DrawIndex = {
  red: 1,
  green: 2,
  mesh: 3,
  line: 4,
};

红色图形对应1,代表最先绘制,蓝色线条对应4,代表最后绘制。

  • 定义drawList数组,保存所有需要绘制的函数。
const drawList = [];
  • 分别添加需要绘制的函数、相应参数列表以及需要绘制的顺序到数组中。
//1.添加绘制网格函数
drawList.push({
  func: this.drawMesh,	//绘制网格函数
  value: [width, height],	//绘制需要的参数列表
  index: DrawIndex.mesh,	//绘制顺序
});

//2.添加绘制红色部分函数
drawList.push({
  func: this.drawRed,	
  value: [width, height, color],	
  index: DrawIndex.red,		//绘制顺序
});

//3.添加绘制绿色部分函数
drawList.push({
  func: this.drawGreen,	
  value: [width, height, color],	
  index: DrawIndex.green,	//绘制顺序
});

//4.添加绘制蓝色线条函数
drawList.push({
  func: this.drawLine,	
  value: [lineWidth, lineColor],	
  index: DrawIndex.line,	//绘制顺序
});
  • 对数组进行按照自定义的顺序进行排序。
drawList.sort((a, b) => a.index - b.index);
  • 遍历函数数组并依次执行其中的函数。
drawList.forEach((draw) => {
  draw.func.apply(this, draw.value);
});

这样就可以按照我们自定义的顺序来进行绘制了,解决了上述出现的遮挡问题。修改后的效果:
在这里插入图片描述

结语

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~

  • 49
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 51
    评论
canvas元素本身是没有样式的,但可以通过CSS样式表来控制canvas元素的大小和位置。同时,canvas元素的绘制内容可以通过JavaScript来控制,因此可以通过编写JavaScript代码来实现自定义的样式效果。 以下是一些常用的自定义样式技巧: 1. 设置canvas元素的宽高属性。可以通过CSS样式表或JavaScript代码来设置canvas元素的宽高属性,以控制canvas元素的大小。例如: ```css canvas { width: 500px; height: 300px; } ``` ```javascript const canvas = document.querySelector('canvas'); canvas.width = 500; canvas.height = 300; ``` 2. 控制canvas元素的位置。可以通过CSS样式表来控制canvas元素的位置,例如: ```css canvas { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } ``` 这样可以将canvas元素居中显示在父元素中。 3. 绘制自定义形状。可以通过JavaScript代码来绘制自定义形状,例如: ```javascript const canvas = document.querySelector('canvas'); const ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.moveTo(50, 50); ctx.lineTo(100, 100); ctx.lineTo(50, 150); ctx.closePath(); ctx.fillStyle = '#ff0000'; ctx.fill(); ``` 这段代码将在canvas元素中绘制一个三角形,并设置其填充颜色为红色。 4. 使用图片作为canvas的背景。可以在canvas元素中绘制图片,作为canvas的背景。 ```javascript const canvas = document.querySelector('canvas'); const ctx = canvas.getContext('2d'); const img = new Image(); img.onload = function() { ctx.drawImage(img, 0, 0); }; img.src = 'image.jpg'; ``` 这段代码将在canvas元素中绘制一张图片,并将其作为canvas的背景。
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南木元元

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值