嘿,我在画布上有一个简单的三角形,我想在每个三角形的点上添加侦听器,这样,如果用户单击每个点,就会发生动作。
我想知道是否可以在画布上执行此步骤,如果没有,我的替代方法是什么?所以我的主要问题如下:


我可以在画布单点上添加侦听器吗?如果不是,我有什么选择?


更新:

我已经尝试过运气,并成功在所有画布上添加了click事件,然后获得了鼠标单击的当前点,但是我的解决方案不是最终的,也不是很宝贵。

我是否可以在每个单击的点周围创建一个区域,以使用户不必在点击中变得珍贵?

http://codepen.io/Barak/pen/VadQYm



$(function(){
     var canvas = document.getElementById("canvas");
     var ctx = canvas.getContext("2d");
     var triangle = [{ x: 58, y: 845 }, { x: 984, y: 845 }, { x: 521, y: 41 }];
  drawTriangle(triangle);
    function drawTriangle(t) {
    ctx.beginPath();
    ctx.moveTo(t[0].x, t[0].y);
    ctx.lineTo(t[1].x, t[1].y);
    ctx.lineTo(t[2].x, t[2].y);
    ctx.closePath();
    ctx.strokeStyle = 'black';
    ctx.lineWidth = 2;
    ctx.stroke();
  }
})

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="canvas-wrapper">
        <canvas id="canvas" width=1024 height=980></canvas>
  </div>

最佳答案

在画布上没有可以附加事件的点-仅仅是图形Api-图片的容器(请参见W3School以获得更多参考)。

但是,如果您有坐标,则当然可以始终检测“画布”中的单击位置。

我为您设置了fiddle,以显示可能的解决方案。

canvas.addEventListener("mousedown", doMouseDown, false);
function doMouseDown(e) {
for (i = 0; i < triangle.length; ++i) {
  if ((e.x  triangle[i].x) && (e.y === triangle[i].y)) {
    console.log('you hit an edge!');
  }
 }
}


更新:

如果要创建公差,则必须定义要接受的实际位置的正负。以下是一种简单而不优雅的方法:

function tolerance(number){
//define the tolerance here
var tolerance = 15;
//all the accepted numbers within the tolerance will be in this array
var numberArray=[];

for(i=0;i<(tolerance)*2;++i){
    if(i >= tolerance){
        if(i!=tolerance){
            numberArray[i] = numberArray[i-1]-1;
        }else{
            numberArray[i] = number -1;
        }
    }else{
        if(i!=0){
            numberArray[i] = numberArray[i-1]+1;
        }else{
            numberArray[i] = number +1;
        }
    }
}
//don't forget to put the actual number in the array
numberArray.push(number);
return numberArray;
}


现在,您可以将doMouseDown函数更改为如下所示:

function doMouseDown(e) {
for (k = 0; k < triangle.length; ++k) {
    if ((tolerance(triangle[k].x).indexOf(e.x)!=-1) && (tolerance(triangle[k].y).indexOf(e.y)!=-1)) {
        console.log('you hit an edge!');
    }
  }
}

关于javascript - 在 Canvas 上添加监听器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36738009/

10-09 23:47