【发布时间】:2020-02-12 03:23:11
【问题描述】:
我正在开发一些涉及使用画布的 HTML5 软件。有一个画布,我需要能够在其中缩放并允许用户通过鼠标单击在画布上涂鸦。到目前为止,在我找到的一些示例的帮助下,我已经开始使用缩放功能。问题是缩放后,我的绘图工具上的鼠标位置不正常。在任何缩放之前,我可以画得很好。这是缩放的代码:
//Zoom
mainCanvas.onmousewheel = function(event) {
var mousex = event.clientX - mainCanvas.offsetLeft;
var mousey = event.clientY - mainCanvas.offsetTop;
var wheel = event.wheelDelta / 120;
//n or -n
var zoom = 0;
if(wheel < 0) {
zoom = 1 / 2;
if(currentzoom == 1)
return;
} else {
mousex = event.clientX - mainCanvas.offsetLeft;
mousey = event.clientY - mainCanvas.offsetTop;
zoom = 2;
if(currentzoom == 32)
return;
}
currentzoom *= zoom;
mainContext.translate(originx, originy);
mainContext.scale(zoom, zoom);
mainContext.translate(-(mousex / scale + originx - mousex / (scale * zoom ) ), -(mousey / scale + originy - mousey / (scale * zoom ) ));
originx = (mousex / scale + originx - mousex / (scale * zoom ) );
originy = (mousey / scale + originy - mousey / (scale * zoom ) );
scale *= zoom;
draw(mainContext, gridArray);
}
就像我说的,缩放不是真正的问题,只是问题的根源。下面是为绘图工具确定鼠标位置的代码:
//this function determines the mouse position relative to the canvas element
function ev_canvas(ev) {
if(ev.layerX || ev.layerX == 0) {//Firefox, IE
ev._x = ev.layerX;
ev._y = ev.layerY;
} else if(ev.offsetX || ev.offsetX == 0) {//Opera
ev._x = ev.offsetX;
ev._y = ev.offsetY;
}
var func = tool[ev.type];
if(func) {
func(ev);
}
}
我确定问题出在后面的代码块上,但我不确定是否要修复它。 任何帮助将不胜感激。
【问题讨论】:
-
我不是画布方面的专家,但我想说你必须用你在上下文中使用的基本相同的(可能是一些反向的)变换来变换你的鼠标坐标。现在,当你点击左上角时,它可能会在整个图像的左上角绘制,即使你放大到不同的位置?
-
我确实认为鼠标坐标需要进行类似的转换,我一直在摆弄它,但我还没有找到任何解决方案。至于缩放,它相对于鼠标位置(在鼠标位置的方向)缩放,它绘制的位置取决于我缩放的位置。我正在放大我绘制的彩色网格,并且在缩放后,我正在涂鸦的图像部分通常在画布上不可见。一般来说,你是对的。缩放后的涂鸦通常在实际鼠标位置的上方和左侧。
-
你找到答案了吗?我也有同样的问题。
标签: javascript html canvas drawing dom-events