动态扩展 canvas 而不拉伸绘制的内容
Dynamically expand canvas without stretching what is drawn
我有一个 canvas,我在其中向 canvas 添加正方形。现在,正如您将在我包含的示例中看到的那样,单击按钮 "expand canvas" 确实会展开 canvas,但会拉伸其中已有的内容,而不是适应新内容。我怎样才能让它显示新盒子,而旧盒子保持相同的外观?
见下文:http://jsfiddle.net/3q8tj17c/1/
代码如下:
HTML
<canvas id="canvas" width=100 height=100></canvas>
<button>expand canvas</button>
CSS
#canvas{
border:2px dashed #00242D;
border-right:none;
}
JS
var canvas;
var ctx;
createBox()
function createBox(){
canvas = document.getElementById("canvas");
ctx = canvas.getContext("2d");
}
var squareCount = 0;
function drawSquare(squareNumber){
squareNumber = (squareNumber*100) + 35
ctx.beginPath();
ctx.lineWidth="6";
ctx.setLineDash([0]);
ctx.fillStyle="#006C85";
ctx.strokeStyle="#008BAB";
ctx.fillRect(squareNumber,35,30,30);
ctx.rect(squareNumber,35,30,30);
ctx.stroke();
squareCount++;
}
function drawborderRight(squareNumber){
squareNumber = (squareNumber * 100) - 1
ctx.beginPath();
ctx.setLineDash([8]);
ctx.lineWidth="1";
ctx.strokeStyle="#00242D";
ctx.moveTo(squareNumber,0);
ctx.lineTo(squareNumber, 100);
ctx.stroke();
}
function addBoxText(text, squareNumber){
squareNumber = (squareNumber*100) + 50;
ctx.textAlign="center";
ctx.font = "16px Segoe UI Light";
ctx.fillStyle = "#333"
ctx.fillText(text,squareNumber,90)
}
$('button').on('click', function() {
canvasSize = (squareCount*100) + 100
addBoxText("hello",squareCount)
drawSquare(squareCount)
drawborderRight(squareCount)
$('#canvas').width(canvasSize).height(100);
})
addBoxText("blah",squareCount)
drawSquare(squareCount)
drawborderRight(squareCount)
这一行是错误的。
$("#canvas").width(canvasWidth)
那是jQuery设置了CSS的宽度,需要设置canvas的宽度属性。请注意,这将擦除 canvas(但无论如何您都在重绘,因此在这种情况下这没什么大不了的)。
所以你的 onclick 函数应该看起来像这样
$('button').on('click', function() {
squareCount++;
canvasSize = (squareCount*100);
$('#canvas')[0].width = canvasSize;
for (var i=0; i<squareCount; i++){
addBoxText("hello",i)
drawSquare(i)
}
drawborderRight(squareCount);
})
编辑:围绕事物的顺序进行了更改以产生所需的行为。关键的变化是在调整 canvas 大小后重新绘制所有正方形,因为正如我之前提到的,更改 canvas 尺寸会清除 canvas。
$('#canvas').width
使用 CSS 更改 canvas 的宽度。
这将使现有内容 "stretch" 适应更大的宽度,因此这就是拉伸现有内容的原因。
如果您想使用 CSS 来增加 canvas 尺寸,那么您应该将 canvas 宽度和 canvas 高度都调整相同的百分比避免失真:
var pct=((squareCount*100) + 100)/canvas.width;
$('#canvas').width(canvas.width*pct).height(canvas.height*pct);
使用 CSS 调整大小的副作用是当内容被绘制得更大时,内容将变得 "pixelated"。
要避免这种像素化:
"Remember" 您已经绘制了哪些正方形(可能在 javascript 对象中)。
var box1={x:35,y:35,w:30,h:30};
调整 canvas 元素的大小而不是使用 CSS。调整 canvas 元素的大小也会自动清除所有 canvas 内容。
canvas.width=(squareCount*100) + 100;
使用保存在其 JS 对象中的信息重绘之前的所有方块。
// redraw box1
ctx.fillRect(box1.x,box1.y,box1.w,box1.h);
为了提高效率,您可能会将所有以前的 var box
对象放在一个数组中,然后重绘该数组中的所有框。
var boxes=[];
boxes.push(box1);
for(var i=0;i<boxes.length;i++){
var box=boxes[i];
ctx.fillRect(box.x,box.y,box.w,box.h);
}
我有一个 canvas,我在其中向 canvas 添加正方形。现在,正如您将在我包含的示例中看到的那样,单击按钮 "expand canvas" 确实会展开 canvas,但会拉伸其中已有的内容,而不是适应新内容。我怎样才能让它显示新盒子,而旧盒子保持相同的外观?
见下文:http://jsfiddle.net/3q8tj17c/1/
代码如下:
HTML
<canvas id="canvas" width=100 height=100></canvas>
<button>expand canvas</button>
CSS
#canvas{
border:2px dashed #00242D;
border-right:none;
}
JS
var canvas;
var ctx;
createBox()
function createBox(){
canvas = document.getElementById("canvas");
ctx = canvas.getContext("2d");
}
var squareCount = 0;
function drawSquare(squareNumber){
squareNumber = (squareNumber*100) + 35
ctx.beginPath();
ctx.lineWidth="6";
ctx.setLineDash([0]);
ctx.fillStyle="#006C85";
ctx.strokeStyle="#008BAB";
ctx.fillRect(squareNumber,35,30,30);
ctx.rect(squareNumber,35,30,30);
ctx.stroke();
squareCount++;
}
function drawborderRight(squareNumber){
squareNumber = (squareNumber * 100) - 1
ctx.beginPath();
ctx.setLineDash([8]);
ctx.lineWidth="1";
ctx.strokeStyle="#00242D";
ctx.moveTo(squareNumber,0);
ctx.lineTo(squareNumber, 100);
ctx.stroke();
}
function addBoxText(text, squareNumber){
squareNumber = (squareNumber*100) + 50;
ctx.textAlign="center";
ctx.font = "16px Segoe UI Light";
ctx.fillStyle = "#333"
ctx.fillText(text,squareNumber,90)
}
$('button').on('click', function() {
canvasSize = (squareCount*100) + 100
addBoxText("hello",squareCount)
drawSquare(squareCount)
drawborderRight(squareCount)
$('#canvas').width(canvasSize).height(100);
})
addBoxText("blah",squareCount)
drawSquare(squareCount)
drawborderRight(squareCount)
这一行是错误的。
$("#canvas").width(canvasWidth)
那是jQuery设置了CSS的宽度,需要设置canvas的宽度属性。请注意,这将擦除 canvas(但无论如何您都在重绘,因此在这种情况下这没什么大不了的)。
所以你的 onclick 函数应该看起来像这样
$('button').on('click', function() {
squareCount++;
canvasSize = (squareCount*100);
$('#canvas')[0].width = canvasSize;
for (var i=0; i<squareCount; i++){
addBoxText("hello",i)
drawSquare(i)
}
drawborderRight(squareCount);
})
编辑:围绕事物的顺序进行了更改以产生所需的行为。关键的变化是在调整 canvas 大小后重新绘制所有正方形,因为正如我之前提到的,更改 canvas 尺寸会清除 canvas。
$('#canvas').width
使用 CSS 更改 canvas 的宽度。
这将使现有内容 "stretch" 适应更大的宽度,因此这就是拉伸现有内容的原因。
如果您想使用 CSS 来增加 canvas 尺寸,那么您应该将 canvas 宽度和 canvas 高度都调整相同的百分比避免失真:
var pct=((squareCount*100) + 100)/canvas.width;
$('#canvas').width(canvas.width*pct).height(canvas.height*pct);
使用 CSS 调整大小的副作用是当内容被绘制得更大时,内容将变得 "pixelated"。
要避免这种像素化:
"Remember" 您已经绘制了哪些正方形(可能在 javascript 对象中)。
var box1={x:35,y:35,w:30,h:30};
调整 canvas 元素的大小而不是使用 CSS。调整 canvas 元素的大小也会自动清除所有 canvas 内容。
canvas.width=(squareCount*100) + 100;
使用保存在其 JS 对象中的信息重绘之前的所有方块。
// redraw box1 ctx.fillRect(box1.x,box1.y,box1.w,box1.h);
为了提高效率,您可能会将所有以前的
var box
对象放在一个数组中,然后重绘该数组中的所有框。var boxes=[]; boxes.push(box1); for(var i=0;i<boxes.length;i++){ var box=boxes[i]; ctx.fillRect(box.x,box.y,box.w,box.h); }