我想做的是在画布元素的中间显示多行文本。文本是动态的,因为它是由用户使用文本框输入的,然后画布会更新为用户输入的文本(代码如下所示)。我希望文本出现在画布上的方式与使用 CSS 中的垂直对齐:中间属性显示文本的方式类似。我的问题是解决这个问题的最简单方法是什么。
我遇到的一个大问题是用户可以更改字体。由于不同的字体具有不同的高度(即使它们被定义为 px 高度,它们也不是始终如一的高度)。到目前为止,我最好的想法是计算画布上文本的高度。我在网站上阅读了这篇文章How can you find the height of text on an HTML canvas?,见丹尼尔的第二个回答。这应该计算文本的实际高度,然后可以使用该高度计算文本的正确起始位置,使其在画布上居中。根据我下面的代码,我相信我基本上必须运行类似的代码来预先确定字体的正确起始位置。
这是我在画布上正确包装和显示文本的方法:
function wrapText(context, text, x, y, maxWidth, lineHeight) {
//manage carriage return
text = text.replace(/(\r\n|\n\r|\r|\n)/g, "\n");
//manage tabulation
text = text.replace(/(\t)/g, " "); // I use 4 spaces for tabulation, but you can use anything you want
//array of lines
var sections = text.split("\n");
for (s = 0, len = sections.length; s < len; s++) {
var words = sections[s].split(' ');
var line = '';
for (var n = 0; n < words.length; n++) {
var testLine = line + words[n] + ' ';
var metrics = context.measureText(testLine);
var testWidth = metrics.width;
if (testWidth > maxWidth) {
context.fillText(line, x, y);
line = words[n] + ' ';
y += lineHeight;
} else {
line = testLine;
}
}
context.fillText(line, x, y);
//new line for new section of the text
y += lineHeight;
}
}
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
var maxWidth = 350;
var lineHeight = 25;
var x = (canvas.width - maxWidth) / 2;
var y = 60;
var text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. \nLorem Ipsum has been the industry's standard dummy text ever since the 1500s.";
context.font = '14pt Verdana';
context.fillStyle = '#000';
wrapText(context, text, x, y, maxWidth, lineHeight);
我想知道是否有另一种我没有考虑过的方法可以简化问题,或者这种方法是否是最好的方法?是在画布元素上更简单的方法来垂直对齐文本,类似于 CSS?