因此,我正在開發一些涉及使用畫布的HTML5軟件。有一個畫布,我需要能夠縮放,並允許用戶在鼠標單擊時在畫布上塗鴉。到目前爲止,在我發現的一些示例的幫助下,我已經獲得縮放工作。問題是,縮放後,我的繪圖工具上的鼠標位置不合時宜。在任何縮放之前,我可以畫得很好。下面是變焦代碼:確定縮放後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);
}
}
,但我不知道出來解決它。 任何幫助,將不勝感激。
我在油畫方面的專家,但我要說你必須用你在上下文中使用的基本相同的(也許是一些逆轉換)轉換你的鼠標座標。現在,即使您放大了不同的位置,當您點擊左上角時,它可能會整體繪製在圖像的左上角? – Brendan
我確實認爲鼠標座標需要進行類似的轉換,我一直在擺弄它,但我還沒有找到任何解決方案。至於縮放,它相對於鼠標位置(鼠標位置的方向)進行縮放,並且其繪製位置取決於縮放的位置。我在變焦上我畫一個彩色網格,放大後,我對塗鴉的圖像往往倍的部分不是在畫布上可見。一般來說,你是對的。放大後的塗鴉通常是放在實際的鼠標位置上。 – user1237544
你找到了這個答案嗎?我也有同樣的問題。 – jgarza