javascript - 用 JS 制作绘图应用程序?
问题描述
我想在 JS 中制作一个绘图应用程序。所以我开始用 HTML 创建一个画布,还写了一些 codeIN JS。然而,当我运行我的脚本时,我只能画一些点,我想要的是用鼠标手动画线。
请问你能帮帮我吗 ?
window.addEventListener("load", function(){
var clear = document.getElementById("clear");
var paint = false;
can = document.querySelector("canvas");
context = can.getContext("2d");
can.addEventListener("mouseup", finish);
can.addEventListener("mousemove", draw);
clear.addEventListener("click", clearContent);
can.addEventListener("mousedown", painting);
function clearContent(){
context.clearRect(0, 0, can.width, can.height);
}
function painting(){
paint = true;
}
function finish(){
paint = false;
}
function draw(e){
if (!paint) return 0;
context.strokeStyle="black";
context.lineWidth = 5;
context.lineCap = "round";
context.beginPath();
context.moveTo(e.clientX, e.clientY);
context.lineTo(e.clientX, e.clientY);
context.stroke();
}
});
canvas { border: 1px solid }
<canvas></canvas>
<br>
<button id="clear">Clear</button>
解决方案
您需要从前一点画线,而不是当前点。这样做非常简单,因为画布上下文记住了前一点。另外,不要调用beginPath
,因为这会中断连接点的顺序。
您还可以使用更好的方法来确定确切的坐标。
请参阅您的代码的此变体:
window.addEventListener("load", function(){
var clear = document.getElementById("clear");
var paint = false;
can = document.querySelector("canvas");
context = can.getContext("2d");
can.addEventListener("mouseup", finish);
can.addEventListener("mousemove", draw);
clear.addEventListener("click", clearContent);
can.addEventListener("mousedown", painting);
function clearContent(){
context.clearRect(0, 0, can.width, can.height);
}
function painting(){
paint = true;
context.beginPath(); /// <--- move this here
}
function finish(){
paint = false;
}
function draw(e){
if (!paint) return 0;
var rect = e.target.getBoundingClientRect();
var x = e.clientX - rect.left;
var y = e.clientY - rect.top;
context.strokeStyle="black";
context.lineWidth = 5;
context.lineCap = "round";
// Don't do any of these here:
// context.beginPath();
// context.moveTo(x, y);
// ... only draw line from previous point:
context.lineTo(x, y);
context.stroke();
}
});
canvas { border: 1px solid }
<canvas></canvas>
<br>
<button id="clear">Clear</button>
推荐阅读
- eclipse - Scala Script 在 REPL 中工作,但在 Scala IDE 上失败
- asp.net - DbContext.Query 不接受泛型类型 T,如何在 dot net core api 中进行泛型 DbContext 查询?
- apache-spark - 在 YARN 上使用 Spark 时 maxExecutors、num-executors 和 initialExecutors 之间的关系是什么?
- angular - 如何在角度中引入类似自定义生命周期事件的钩子
- jhipster - KeyCloak Docker compose:禁用表的覆盖
- angular - 如何在 Pusher 中向频道的所有成员广播消息事件?
- python - 如何获取json中键的所有值,而不仅仅是最后一组?
- github - 如何将 gerrit 存储库与 github 存储库同步?
- linux - 启动 mongodb 服务器时出错
- c++ - 同一文件的不同哈希值(使用 ifstream 完成读取)