【发布时间】:2019-06-09 18:09:48
【问题描述】:
我很难解决这个问题:我使用这些函数来将单行文本适应给定的尺寸。
function getFontSize(width, height, text, font, callback) {
var n = 100;
var ctxfont = n + 'px ' + font;
var result = measureTextHeight(ctxfont, text);
while (result.width > width || result.height > height) {
n--;
var ctxfont = n + 'px ' + font;
var result = measureTextHeight(ctxfont, text);
}
callback({
'width': result.width,
'height': result.height,
'size': n
});
}
function measureTextHeight(ctxFont, text) {
var width = 1500;
var height = 500;
var canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = height;
var ctx = canvas.getContext("2d");
ctx.save();
ctx.font = ctxFont;
ctx.clearRect(0, 0, width, height);
ctx.fillText(text, parseInt(width * 0.1, 10), parseInt(height / 2, 10));
ctx.restore();
document.body.appendChild(canvas);
var data = ctx.getImageData(0, 0, width, height).data;
var topMost = false;
var bottomMost = false;
var leftMost = false;
var rightMost = false;
for (var x = 0; x < width; x++) {
for (var y = 0; (y < height) && (!leftMost); y++) {
//console.log("x: %s y: %s index: %s", x,y, getAlphaIndexForCoordinates(x,y,width,height).toString() );
if (data[getAlphaIndexForCoordinates(x, y, width, height)] != 0) {
leftMost = x;
}
}
}
for (var y = 0; y < height; y++) {
for (var x = 0; (x < width) && (!topMost); x++) {
//console.log("x: %s y: %s index: %s", x,y, getAlphaIndexForCoordinates(x,y,width,height).toString() );
if (data[getAlphaIndexForCoordinates(x, y, width, height)] != 0) {
topMost = y;
}
}
}
for (var x = width - 1; x >= 0; x--) {
for (var y = height - 1; (y >= 0) && (!rightMost); y--) {
//console.log("x: %s y: %s index: %s", x,y, getAlphaIndexForCoordinates(x,y,width,height).toString() );
if (data[getAlphaIndexForCoordinates(x, y, width, height)] != 0) {
rightMost = x;
}
}
}
for (var y = height - 1; y >= 0; y--) {
for (var x = width - 1; (x >= 0) && (!bottomMost); x--) {
//console.log("x: %s y: %s index: %s", x,y, getAlphaIndexForCoordinates(x,y,width,height).toString() );
if (data[getAlphaIndexForCoordinates(x, y, width, height)] != 0) {
bottomMost = y;
}
}
}
canvas.remove();
return ({
width: (rightMost - leftMost) + 1
, height: (bottomMost - topMost) + 1
});
}
function getAlphaIndexForCoordinates(x, y, width, height) {
return (((width * 4 * y) + 4 * x) + 3);
}
我将所需的尺寸和字体传递给 getFontSize 函数,它会返回文本的实际宽度和高度以及完成它所需的字体大小。这样,我可以使用 ctx.filltext() 函数将文本绘制到画布上,这是最合适的,并根据其宽度和高度将其对齐在中心。我不确定这是否是实现预期结果的最有效方式,但它正在发挥作用。
我现在想要做的不是让它单行,我可以为 div 设置给定的宽度和高度,然后给出文本,它会完全适合那些尺寸,如果需要添加换行符,并且仍然返回文本的实际宽度和高度,因此我可以像这样将它正确绘制到画布上:http://jsfiddle.net/vkgjrd3e/ 尽管在小提琴中它仍然在 div 的底部有一些空间。
考虑到它的字体和容器尺寸,我想要实现的是最适合文本;如果需要,添加换行符。
【问题讨论】:
-
你的主要问题是什么??
-
@Sushil 我正在寻找的是当我将尺寸和文本传递给函数时,它太长了,如果需要,它会自动换行。假设我向函数传递了一个大文本,宽度和高度为 200px。我希望它返回正确的字体大小和带有换行符的文本(如果需要),以便它很好地适应度量。我的代码已经这样做了,但它没有添加换行符,这就是我坚持的地方。如果我需要在画布上添加长文本,它只会缩小它直到它适合一行。检查当前发生的事情:jsfiddle.net/pqhudmj0
-
@MarcielFonseca 你需要这样的东西吗? jsfiddle.net/bpyqfhaz
-
@Sushil 正是如此。文本将从我的 API 中获取,然后将给定的宽度和高度传递给函数
标签: javascript jquery canvas