【发布时间】:2020-10-27 20:35:36
【问题描述】:
我正在尝试在 HTML5 Canvas 中实现缩放。我遇到了其他解释如何做到这一点的线程,但它们利用了画布的上下文,存储了以前的转换。我想避免这种情况。
到目前为止,我设法做到以下几点 (https://jsfiddle.net/wfqzr538/)
<!DOCTYPE html>
<html>
<body style="margin: 0">
<canvas id="canvas" width="400" height="400" style="border: 1px solid #d3d3d3"></canvas>
<script>
const canvas = document.getElementById("canvas");
const context = canvas.getContext("2d");
let cursorX = 0,
cursorY = 0;
let zoom = 1;
canvas.onmousemove = mouseMove;
window.onkeydown = keyDown;
draw();
function mouseMove(evt) {
cursorX = evt.clientX;
cursorY = evt.clientY;
}
function keyDown(evt) {
if (evt.key == "p") {
zoom += 0.1;
}
if (evt.key == "m") {
zoom -= 0.1;
}
draw();
}
function draw() {
context.clearRect(0, 0, canvas.width, canvas.height);
const translationX = -cursorX * (zoom - 1);
const translationY = -cursorY * (zoom - 1);
context.translate(translationX, translationY);
context.scale(zoom, zoom);
context.fillRect(100, 100, 30, 30);
context.scale(1 / zoom, 1 / zoom);
context.translate(-translationX, -translationY);
}
</script>
</body>
</html>
如果我在同一位置缩放,上面的代码可以工作,但一旦我改变它就会中断。例如,如果我在正方形的左上角放大两次,它就可以工作。但是,如果我在左上角缩放一次,然后在右下角缩放,它就会中断。
我已经尝试解决这个问题一段时间了。我认为它没有考虑以前在画布上进行的翻译,但我不确定。
非常感谢您的帮助。
【问题讨论】:
标签: javascript html html5-canvas