我有一个HTML5画布,在上面绘制了几个形状。
我想要的是,当鼠标点击任何形状时,该形状应该被选中(至少能告诉选中的是哪种形状)。
谢谢。
我想要的是,当鼠标点击任何形状时,该形状应该被选中(至少能告诉选中的是哪种形状)。
谢谢。
var triangle = new Kinetic.Shape(function(){
var context = this.getContext();
context.beginPath();
context.lineWidth = 4;
context.strokeStyle = "black";
context.fillStyle = "#00D2FF";
context.moveTo(120, 50);
context.lineTo(250, 80);
context.lineTo(150, 170);
context.closePath();
context.fill();
context.stroke();
});
triangle.on("mouseout", function(){
writeMessage(messageLayer, "Mouseout triangle");
});
triangle.on("mousemove", function(){
var mousePos = stage.getMousePosition();
var x = mousePos.x - 120;
var y = mousePos.y - 50;
writeMessage(messageLayer, "x: " + x + ", y: " + y);
});
shapesLayer.add(triangle);
var circle = new Kinetic.Shape(function(){
var canvas = this.getCanvas();
var context = this.getContext();
context.beginPath();
context.arc(380, canvas.height / 2, 70, 0, Math.PI * 2, true);
context.fillStyle = "red";
context.fill();
context.lineWidth = 4;
context.stroke();
});
circle.on("mouseover", function(){
writeMessage(messageLayer, "Mouseover circle");
});
circle.on("mouseout", function(){
writeMessage(messageLayer, "Mouseout circle");
});
circle.on("mousedown", function(){
writeMessage(messageLayer, "Mousedown circle");
});
circle.on("mouseup", function(){
writeMessage(messageLayer, "Mouseup circle");
});
shapesLayer.add(circle);
stage.add(shapesLayer);
stage.add(messageLayer);
此外,我还添加了一些鼠标悬停检测,如果光标在形状内部且不使用任何JavaScript库。
基于矩形的鼠标悬停检测:
function isCursorWithinRectangle(x, y, width, height, mouseX, mouseY) {
if(mouseX > x && mouseX < x + width && mouseY > y && mouseY < y + height) {
return true;
}
return false;
}
基于圆形的鼠标悬停检测:
function isCursorWithinCircle(x, y, r, mouseX, mouseY) {
var distSqr = Math.pow(x - mouseX, 2) + Math.pow(y - mouseY, 2);
if(distSqr < r * r) {
return true;
}
return false;
}
有一种非常简单的方法可以使用像素精度选择复杂形状,而不涉及边界矩形或数学计算。
这个想法是将所有形状都复制到一个隐藏的次要画布上,并为每个形状分配一个唯一的颜色。当您在原始画布上执行mouseover或click事件时,您将保存与可见画布相关的鼠标(x,y)坐标,然后使用相同的坐标查找隐藏画布上的像素颜色。因为每个形状在隐藏画布上具有唯一的颜色,该颜色对应于用户选择的确切形状。
请注意,这仅支持大约1670万个形状,因为RGB只有24位颜色,但这应该足够了。
以下是一个使用D3和Canvas的简单示例:http://bl.ocks.org/syntagmatic/6645345
Canvas没有像DOM那样的界面来处理其上的元素。它只用于绘图。
您需要将资产创建为对象,并使用绘图循环来绘制它们。然后您就可以忘记canvas
元素,可以与对象一起工作,包括它们的偏移量等。