2013-03-10 60 views
2

我想弄清楚如何用户的鼠标在jQuery的HTML 5画布上击中一行。有没有办法使用jQuery检测画布线?

这里是产生画布上的线条代码:

<canvas id="myCanvas" width="400" height="400" style="border:1px solid #c3c3c3;"> 
Your browser does not support the canvas element. 
</canvas> 

<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> 
<script type="text/javascript"> 
    window.onload = function(){ 
     var c=document.getElementById("myCanvas"); 
     var ctx=c.getContext("2d"); 
     ctx.moveTo(40,0); 
     ctx.lineTo(40,360); 
     ctx.stroke(); 
     ctx.moveTo(80,400); 
     ctx.lineTo(80,40); 
     ctx.stroke(); 
     ctx.moveTo(120,0); 
     ctx.lineTo(120,360); 
     ctx.stroke(); 
     ctx.moveTo(160,400); 
     ctx.lineTo(160,40); 
     ctx.stroke(); 
    }; 
</script> 

我使用,我居然在这里上的另一个问题找到了一个修改jQuery脚本,但现在我无法弄清楚如何检测这条线,主要是画布中从白色到黑色的颜色差异。我知道这可以通过图像来完成,但我还没有看到任何像这样的东西。

我想我真正的问题是,有没有办法使用jQuery检测canvas元素的颜色变化?

回答

6

它可能用javascript做。事实上,你在上面的例子中没有使用任何jQuery。一个简单的方法是从画布上抓取像素数据,然后在指定的x和y位置检查alpha。如果alpha未设置为0,那么您在画布上绘制了一些东西。下面是我真正快速完成的功能。

Live Demo

var canvas = document.getElementById("canvas"), 
    ctx = canvas.getContext("2d"), 
    width = 400; 
height = 400; 

canvas.width = canvas.height = 200; 

// draw 
ctx.moveTo(40, 0); 
ctx.lineTo(40, 360); 
ctx.stroke(); 
ctx.moveTo(80, 400); 
ctx.lineTo(80, 40); 
ctx.stroke(); 
ctx.moveTo(120, 0); 
ctx.lineTo(120, 360); 
ctx.stroke(); 
ctx.moveTo(160, 400); 
ctx.lineTo(160, 40); 
ctx.stroke(); 

function detectLine(x, y) { 
    var imageData = ctx.getImageData(0, 0, width, height), 
     inputData = imageData.data, 
     pData = (~~x + (~~y * width)) * 4; 

    if (inputData[pData + 3]) { 
     return true; 
    } 

    return false; 
} 

canvas.addEventListener("mousemove", function(e){ 
    var x = e.pageX, 
     y = e.pageY; 
    console.log(detectLine(x, y)); 
}); 

console.log(detectLine(40, 100)); 
console.log(detectLine(200, 200)); 
+1

这工作完全!我在我的计算机上的原始代码中确实有jQuery代码,但意识到我这样做的方式只有在'canvas'中有图像时才有效,这就是我发布此问题的原因。 – 2013-03-10 18:42:44

相关问题