请参考以下更改以允许缩放并保持旋转:
修改后的fiddle
您不需要为此使用save/restore,因为您不断地更改缩放和旋转。让它们累积。好的,我错过了您想要翻译画布。在这种情况下,累积会很复杂,因此请使用save和restore :)
但是,您可以重构代码,使旋转和缩放在一个位置进行,并在鼠标移动事件中进行移动。
将translate移到全局(或者像这里一样,移到通常位于全局的图像加载中),以便您有一个中心起点。
进行了以下修改(请参见上面更新的fiddle):
var zoomDelta = 0.1;
var currentScale = 1;
var currentAngle = 0;
var startX, startY, isDown = false;
简化的加载(我建议在
window.onload
上执行此操作):
jQuery('#carregar').click(function () {
element.translate(canvas.width / 2, canvas.height / 2);
drawImage();
jQuery('#canvas').attr('data-girar', 0);
this.disabled = true;
});
旋转函数现在被简化为:
jQuery('#giraresq').click(function () {
angleInDegrees = 90;
currentAngle += angleInDegrees;
drawImage()
});
jQuery('#girardir').click(function () {
angleInDegrees = -90;
currentAngle += angleInDegrees;
drawImage()
});
缩放功能:
jQuery('#zoomIn').click(function () {
currentScale += zoomDelta;
drawImage()
});
jQuery('#zoomOut').click(function () {
currentScale -= zoomDelta;
drawImage();
});
为了移动画布,我们需要跟踪鼠标的按下、抬起和移动:
canvas.onmousedown = function (e) {
var pos = getMousePos(canvas, e);
startX = pos.x;
startY = pos.y;
isDown = true;
}
canvas.onmousemove = function (e) {
if (isDown === true) {
var pos = getMousePos(canvas, e);
var x = pos.x;
var y = pos.y;
element.translate(x - startX, y - startY);
drawImage();
startX = x;
startY = y;
}
}
canvas.onmouseup = function (e) {
isDown = false;
}
重构后的函数现在可以完成所有的清除、旋转和缩放操作:
function drawImage() {
clear();
element.save();
element.scale(currentScale, currentScale);
element.rotate(currentAngle * Math.PI / 180);
element.drawImage(image, -image.width * 0.5, -image.width * 0.5);
element.restore();
}
degreesInAngle += 90
更改为degreesInAngle = 90
,因为它们是通过旋转累积的。当然,对于 -= 也是一样。 - user1693593