私がやろうとしているのは、キャンバス要素の真ん中に複数行のテキストを表示することです。ユーザーがテキスト ボックスを使用してテキストを入力すると、テキストは動的になり、ユーザーが入力したテキストでキャンバスが更新されます (以下に示すコード)。CSS で vertical-align: middle プロパティを使用してテキストを表示する方法と同様の方法でテキストをキャンバスに表示したいと考えています。私の質問は、この問題にアプローチする最も簡単な方法は何かということです。
私が抱えている大きな問題は、ユーザーがフォントを変更できることです。フォントが異なれば高さも異なるため (たとえそれらが px の高さで定義されていても、一貫してその高さではありません)。これまでのところ、キャンバス上のテキストの高さを計算するのが最善のアイデアです。サイトでこの記事を読みました HTML キャンバス上のテキストの高さをどのように見つけることができますか? 、ダニエルによる2番目の回答を参照してください。これにより、テキストの実際の高さが計算され、これを使用してテキストの正しい開始位置が計算され、キャンバスの中央に配置されます。以下のコードに基づいて、基本的に同様のコードを実行して、フォントの正しい開始位置を事前に決定する必要があると思います。
これは、キャンバス上のテキストを適切にラップして表示するための私のアプローチです。
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 と同様に、canvas 要素でテキストを垂直方向に配置する簡単な方法はありますか?