1
A
回答
3
是的,你是对的。
新的isPointInPath()仅适用于“胖”行的中心线 - 不是行的全部宽度。
它更人性化的封闭图形是超过1个像素宽;)
用于您的具体问题解决办法:不要画脂肪线,绘制一个20像素宽的矩形。
这里是代码和一个小提琴:http://jsfiddle.net/m1erickson/QyWDY/
该代码使用基本的三角创建一个围绕一条线的矩形。在mousedown事件处理程序中,它透明地重绘该矩形,然后测试isPointInPath()。
如果您需要测试多义线,可以使用这些相同的原则为多义线的每个线段制作矩形线。
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
body{ background-color: ivory; }
canvas{border:1px solid red;}
</style>
<script>
$(function(){
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
// get canvas's relative position
var canvasOffset=$("#canvas").offset();
var offsetX=canvasOffset.left;
var offsetY=canvasOffset.top;
// line specifications
var x1=50;
var y1=50;
var x2=300;
var y2=100;
// draw the lineRectangle
var lineRect=defineLineAsRect(x1,y1,x2,y2,20);
drawLineAsRect(lineRect,"black");
// overlay the line (just as visual proof)
drawLine(x1,y1,x2,y2,3,"red");
function drawLine(x1,y1,x2,y2,lineWidth,color){
ctx.fillStyle=color;
ctx.strokeStyle=color;
ctx.lineWidth=lineWidth;
ctx.save();
ctx.beginPath();
ctx.moveTo(x1,y1);
ctx.lineTo(x2,y2);
ctx.stroke();
ctx.restore();
}
function drawLineAsRect(lineAsRect,color){
var r=lineAsRect;
ctx.save();
ctx.beginPath();
ctx.translate(r.translateX,r.translateY);
ctx.rotate(r.rotation);
ctx.rect(r.rectX,r.rectY,r.rectWidth,r.rectHeight);
ctx.translate(-r.translateX,-r.translateY);
ctx.rotate(-r.rotation);
ctx.fillStyle=color;
ctx.strokeStyle=color;
ctx.fill();
ctx.stroke();
ctx.restore();
}
function defineLineAsRect(x1,y1,x2,y2,lineWidth){
var dx=x2-x1; // deltaX used in length and angle calculations
var dy=y2-y1; // deltaY used in length and angle calculations
var lineLength= Math.sqrt(dx*dx+dy*dy);
var lineRadianAngle=Math.atan2(dy,dx);
return({
translateX:x1,
translateY:y1,
rotation:lineRadianAngle,
rectX:0,
rectY:-lineWidth/2,
rectWidth:lineLength,
rectHeight:lineWidth
});
}
function handleMouseDown(e){
mouseX=parseInt(e.clientX-offsetX);
mouseY=parseInt(e.clientY-offsetY);
// draw our lineRect
drawLineAsRect(lineRect,"transparent");
// test if hit in the lineRect
if(ctx.isPointInPath(mouseX,mouseY)){
alert('Yes');
}
}
canvas.addEventListener("mousedown", handleMouseDown, false);
}); // end $(function(){});
</script>
</head>
<body>
<canvas id="canvas" width=310 height=115></canvas>
</body>
</html>
相关问题
- 1. 帆布串点击检测
- 2. 帆布画线动画
- 3. 帆布对角线运动
- 4. 铬帆布线性渐变= Firefox的帆布线性渐变
- 5. Android上帆布
- 6. 动画用帆布
- 7. 在每个EditText上执行根布局上的活动过渡动画点击
- 8. 查看按钮上的活动点击
- 9. 取消上次点击Google Analytics活动
- 10. fullcalendar上的一天点击活动
- 11. 计算X,帆布点
- 12. 帆布在Keydown上的矩形运动
- 13. AngularJS中的点击活动
- 14. Jpanel点击创建活动
- 15. 通过点击活动android
- 16. Flex帆布滚动问题
- 17. HTML帆布梯度动画
- 18. 帆布响应滚动
- 19. 移动图案帆布
- 20. 帆布形状动画
- 21. 加帆布动态与jQuery
- 22. Cufon帆布局部覆盖可点击区域
- 23. 关闭关闭帆布导航时菜单项点击
- 24. 在小帆布上看到较大帆布的一部分
- 25. iphone/ipad大帆布vs小帆布+ div动画
- 26. 移除焦点并点击活动 - Jquery
- 27. 帆布内部的帆布html5
- 28. 为什么帆布线不可见?
- 29. 大尺寸帆布2d不画线
- 30. 帆布元素线条不直?
您是否有绘制矩形而不是线条的示例?如果你想通过mousemoves创建线条并且你不知道线条位置,我认为这很难做到。 – Maxii 2013-03-23 20:43:15
编辑我的答案,为你包括一个例子:) – markE 2013-03-26 18:12:05