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 - 在 render() 中修改 this.state 是否合理?

javascript - 使用 Jquery 将文本框值附加到 Summernote Textarea

javascript - 像这个网站一样的 CSS 框阴影

javascript - 浏览隐藏在网页上的链接(可访问性问题)

javascript - 移动 Chrome 栏占用 100% 高度 css 的空间

javascript - 如何在按钮单击时以 Angular 动画背景变化效果

javascript - 创建复杂的 HTML 表格

javascript - Canvas 0px 线条画 (html5)

javascript - Internet Explorer Canvas 在多个绘图上出现 Canvas 问题?

c# - WPF Canvas 中的网格线