javascript - 画布上的画线是虚线的
问题描述
我试图在彩虹笔画布上工作,但每当我画画时,线条就会出现虚线。只有当我真正缓慢地移动时,它才会正确显示。
'mousemove' 事件侦听器是否真的无法检测到快速变化,或者我的代码中是否存在其他问题?此外,如果有人想要一个工作程序,这里是 codepen 链接。
const canvas = document.querySelector('#draw');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var ctx = canvas.getContext("2d");
ctx.lineWidth = 50;
ctx.lineCap = "round";
ctx.lineJoin = "line";
ctx.strokeStyle = 0;
let hue = 0;
var [x, y] = [0, 0];
let paint = false;
canvas.addEventListener('mousedown', beginDraw);
function beginDraw(e) {
paint = true;
[x, y] = [e.x, e.y];
// ctx.moveTo(x, y);
}
canvas.addEventListener('mousemove', draw);
function draw(e) {
if (paint == false)
return;
ctx.strokeStyle = `hsla(${hue}, 100%, 50%, 0.5)`;
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(e.x, e.y);
ctx.stroke();
[x, y] = [e.x, e.y];
hue++;
}
canvas.addEventListener('mouseup', endDraw);
function endDraw() {
paint = false;
}
<canvas id="draw"></canvas>
解决方案
事件mousemove
处理程序每秒只触发这么多次。每次执行时,您的代码都会从上一个鼠标位置到当前鼠标位置绘制一条线。随后的每一行都与前一行部分重叠。
对于慢速笔划,重叠几乎是 100%,因此您不会看到效果,但对于较快的笔划,重叠显示为一个圆圈。由于您使用的是部分透明度,因此线条重叠的点会变得更暗,这会导致您看到的“虚线”效果。
如果将不透明度设置为 1,效果将消失。
推荐阅读
- android-emulator - 带有 vnc 服务器的无头仿真器
- javascript - 我需要提取字符串中数字的前 6 位和后 4 位,并使用正则表达式删除相同的前导零
- json - powershell json打印父母和孩子
- django - 更新现有模型的 FieldField
- django - Django inineformset 保存和删除
- asp.net-core - 如何在 AddFacebook AspNetCore 身份验证方案上正确设置 auth_type 参数?
- android - 无法访问动态功能模块的资源
- java - 如何从 XML 文件生成带有 jacksonxml 注释的 java 类
- android - 将数据从广播接收器发送到活动
- c - 函数的冲突类型