javascript - 如何使用单击事件处理程序在点之间画线?

标签 javascript html canvas

我在 HTML Canvas 上使用事件处理程序来跟踪用户点击位置的坐标,我的想法是用一条线将坐标连接在一起。

下面的代码创建了一个数组,并在用户点击的 Canvas 元素中保留了一个坐标列表,还包含在当前点击的点和之前点击的点之间画一条线的逻辑。

我遇到的问题是,无论我点击多少次,即使我的数组中填充了坐标,也不会在点之间绘制线。

我不完全确定我做错了什么,或者是否进行了一些重新渲染可能会擦掉我在 Canvas 上绘制的图画。

var coords = [];
var canvas = document.getElementById('canvas');
canvas.addEventListener('click', function (event) {
    var coord = { "x": event.screenX, "y": event.screenY };
    document.getElementById("coords").innerText = "{" + coord.x + ", " + coord.y + "}";
    coords.push(coord);
    var max = coords.length - 1;
    if (typeof coords[max - 1] !== "undefined") {
        var curr = coords[max], prev = coords[max - 1];
        var context = canvas.getContext("2d");
        context.beginPath();
        context.moveTo(prev.x, prev.y);
        context.lineTo(curr.x, curr.y);
        context.stroke();
    }
});
<!doctype html>
</html>
<head>
    <title>Drawing canvas</title>
    <style>
        canvas {
            width: 200px;
            height: 200px;
            border: 2px solid black;
            border-radius: 5px;
        }
    </style>
</head>
<body>
    <p id='coords'></p>
    <canvas id='canvas'></canvas>
</body>
</html>

最佳答案

将您的上下文移到点击事件之外并使用 Canvas 坐标而不是屏幕坐标:event.xevent.y 不要对 Canvas 使用 CSS 尺寸。检查这个post

var coords = [];
var canvas = document.getElementById('canvas');
var context = canvas.getContext("2d");
canvas.addEventListener('click', function (event) {
    var coord = { "x": event.x, "y": event.y};
    document.getElementById("coords").innerText = "{" + coord.x + ", " + coord.y + "}";
    coords.push(coord);
    var max = coords.length - 1;
    if (typeof coords[max - 1] !== "undefined") {
        var curr = coords[max], prev = coords[max - 1];
        context.beginPath();
        context.moveTo(prev.x, prev.y);
        context.lineTo(curr.x, curr.y);
        context.stroke();
    }
});
    <style>
        canvas {     
            border: 1px solid black;
            border-radius: 0px;
        }
        body {
          margin: 0;
          padding: 0;
        }
    </style>

   
    <canvas id='canvas' width="200" height="200"></canvas>
     <p id='coords'></p>

关于javascript - 如何使用单击事件处理程序在点之间画线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52099450/

相关文章:

javascript - 如何降低 if/else 复杂度?

javascript - 可以使用 getElementByID 显示多个 div 包装器的内容吗

php - 有没有办法通过网页上的链接打开用户计算机上本地网络上的文件?

angular - "Canvas is not a constructor"错误 - 将 Fabric JS 与 Angular 6 一起使用

javascript - 在 FabricJS 中绘制一条波浪线

javascript - WordPress 自定义元框无法保存

javascript - 在 HTML5 视频元素中播放电影时如何在 IOS 上显示非全尺寸视频?

javascript - 单击鼠标中键时发出 Jquery 警报?

html - 将一个 div 滚动到另一个

javascript - FabricJS:在 Canvas 上使用对象控件来调整大小,但不能缩放