【发布时间】:2016-08-11 21:33:24
【问题描述】:
我正在尝试创建一个允许放大的可平移图像查看器。如果缩放系数或图像大小使得图像不再在整个画布上绘制,那么我希望画布区域不包含使用指定背景颜色绘制的图像。
我当前的实现允许缩放和平移,但在平移操作期间图像会在其后留下平铺轨迹(很像赢得游戏时 Windows Solitaire 中的牌)。如何清理我的画布,使图像不会留下痕迹,并且我的背景矩形正确呈现在我的画布中?
要重新创建不需要的效果,请将放大倍率设置为您看到深灰色背景显示的某个级别,然后用鼠标平移图像(鼠标向下并拖动)。
下面添加了代码 sn-p 和 Plnkr 链接,供那些希望在那里捣乱的人使用。 http://plnkr.co/edit/Cl4T4d13AgPpaDFzhsq1
<!DOCTYPE html>
<html>
<head>
<style>
canvas{
border:solid 5px #333;
}
</style>
</head>
<body>
<button onclick="changeScale(0.10)">+</button>
<button onclick="changeScale(-0.10)">-</button>
<div id="container">
<canvas width="700" height="500" id ="canvas1"></canvas>
</div>
<script>
var canvas = document.getElementById('canvas1');
var context = canvas.getContext("2d");
var imageDimensions ={width:0,height:0};
var photo = new Image();
var isDown = false;
var startCoords = [];
var last = [0, 0];
var windowWidth = canvas.width;
var windowHeight = canvas.height;
var scale=1;
photo.addEventListener('load', eventPhotoLoaded , false);
photo.src = "http://www.html5rocks.com/static/images/cors_server_flowchart.png";
function eventPhotoLoaded(e) {
imageDimensions.width = photo.width;
imageDimensions.height = photo.height;
drawScreen();
}
function changeScale(delta){
scale += delta;
drawScreen();
}
function drawScreen(){
context.fillRect(0,0, windowWidth, windowHeight);
context.fillStyle="#333333";
context.drawImage(photo,0,0,imageDimensions.width*scale,imageDimensions.height*scale);
}
canvas.onmousedown = function(e) {
isDown = true;
startCoords = [
e.offsetX - last[0],
e.offsetY - last[1]
];
};
canvas.onmouseup = function(e) {
isDown = false;
last = [
e.offsetX - startCoords[0], // set last coordinates
e.offsetY - startCoords[1]
];
};
canvas.onmousemove = function(e)
{
if(!isDown) return;
var x = e.offsetX;
var y = e.offsetY;
context.setTransform(1, 0, 0, 1,
x - startCoords[0], y - startCoords[1]);
drawScreen();
}
</script>
</body>
</html>
【问题讨论】:
-
可能类似于
context.save(); context.fillRect(0,0, windowWidth, windowHeight); context.restore();因为 setTransform 也会更改您填充的矩形。 -
你是对的。如果您想将该评论作为答案,我将很高兴接受它。
标签: javascript canvas