Я не думаю, что canvas предоставляет внутреннюю функциональность мыши для своих форм. У вас есть два варианта
Вы можете сделать то, что сделал скиннер с помощью easeljs . Вы можете нарисовать фигуру на временном холсте, а затем использовать context.getImageData(left, top, width, height)
, чтобы проверить, прозрачен ли пиксель под мышью или нет. Преимущество заключается в том, что он работает универсально, без необходимости знать ограничивающую рамку формы. Недостатком является то, что это очень медленно.
Сделайте то, что я сделал, используйте сложные алгоритмы, чтобы определить, находится ли точка внутри или снаружи фигуры. Я постараюсь создать для вас пример jsfiddle.
Вот пример jsfiddle http://jsfiddle.net/pukster/HNA2z/1/ Он показывает, как вы можете использовать простой простой javascript для перехвата событий мыши и создания эффектов прокрутки для прямоугольников, окружностей и сложных полигонов. Установите k=0
для прямоугольника, k=1
для круга и k=2
для многоугольника (предупреждение, код очень грязный).
Box :
function Box(x,y,w,h){
this.x=x;
this.y=y;
this.w=w;
this.h=h;
this.color=cOut;
this.inside = false;
this.draw=function(){
ctx.fillStyle=this.color;
ctx.fillRect(this.x,this.y,this.w,this.h);
}
this.onMouseOver=function(){
this.color=cOver;
this.draw();
}
this.onMouseOut=function(){
this.color=cOut;
this.draw();
}
this.isInside = function(x,y){
return (this.x<=x) && (x<=this.x+this.w) && (this.y<=y) && (y<=this.y+this.h);
}
}
круг
function Circle(x,y,r){
this.x=x;
this.y=y;
this.r=r;
this.color=cOut;
this.inside = false;
this.draw=function(){
ctx.fillStyle=this.color;
ctx.beginPath();
ctx.arc(x, y, r, 0, Math.PI*2, true);
ctx.closePath();
ctx.fill();
}
this.onMouseOver=function(){
this.color=cOver;
this.draw();
}
this.onMouseOut=function(){
this.color=cOut;
this.draw();
}
this.isInside = function(x,y){
return Math.sqrt((this.x-x)*(this.x-x)+(this.y-y)*(this.y-y))<this.r;
}
}
Polygon
function Polygon(points){
this.points = points;
this.color=cOut;
this.inside = false;
this.draw=function(){
ctx.fillStyle=this.color;
ctx.beginPath();
var x,y;
x = this.points[0][0];
y = this.points[0][1];
ctx.moveTo(x, y);
for (var i = 1; i < this.points.length; i++){
x = this.points[i][0];
y = this.points[i][1];
ctx.lineTo(x, y);
}
ctx.closePath();
ctx.fill();
}
this.onMouseOver=function(){
this.color=cOver;
this.draw();
}
this.onMouseOut=function(){
this.color=cOut;
this.draw();
}
this.isInside = function(x,y){
for (var c = false, i = - 1, l = this.points.length, j = l - 1; ++i < l; j = i)((this.points[i][1] <= y && y < this.points[j][1]) || (this.points[j][1] <= y && y < this.points[i][1])) && (x < (this.points[j][0] - this.points[i][0]) * (y - this.points[i][1]) / (this.points[j][1] - this.points[i][1]) + this.points[i][0]) && (c = ! c);
return c;
}
}
Захват мыши немного технический, но вот как я проверяю переходы:
Переходы
function onMouseMove(e){
var x = (window.Event) ? e.pageX : event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
var y = (window.Event) ? e.pageY : event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
if (shape.isInside(x,y) && ! shape.inside){
shape.inside = true;
shape.onMouseOver();
}
else if (!shape.isInside(x, y) && shape.inside){
shape.onMouseOut();
shape.inside = false;
}
}