CHROMA

世の中の "当たり前" を確認する

Canvas でテキストの中央揃え

昨日から引き続き HTML5 Canvas 読んでて、今日は「3.1 基本的なテキストの描画」をやってる。

テキストの中央揃えには measureText() メソッド を使うみたい。

以下のものでは Canvas 幅の半分の位置から算出したテキスト幅の半分をさらに引いて行内 (x軸)の中央揃えを行い、列内(y軸)に対しての中央揃えは単純に Canvas の縦幅の半分の位置を使ってる。

上記の指定を行った後、これらを context.fillText の x座標、y座標に指定するとテキストが中央揃えになる。

Demo: http://jsfiddle.net/thleap/aqs5at8p/4/

window.addEventListener('load', eventWindowLoaded, false);

function eventWindowLoaded() {
  canvasApp();
}

function canvasApp() {
  var theCanvas = document.getElementById('canvasOne');
  var context = theCanvas.getContext('2d');

  var message = 'your text';

  var formElement = document.getElementById('textBox');
  formElement.addEventListener('keyup', textBoxChanged, false);

  drawScreen();

  function drawScreen() {
    // 背景
    context.fillStyle = 'yellow';
    context.fillRect(0, 0, theCanvas.width, theCanvas.height);
    // テキスト
    context.font = '24px sans-serif';

    // テキストを Canvas に対して中央揃え
    var metrics = context.measureText(message);
    var textWidth = metrics.width;
    var xPosition = (theCanvas.width / 2) - (textWidth / 2);

    var yPosition = (theCanvas.height / 2);

    context.fillStyle = 'red';
    context.fillText(message, xPosition, yPosition);
  }

  // input 要素に入力したテキストを Canvas 上に表示
  function textBoxChanged(e) {
    var target = e.target;
    message = target.value;
    drawScreen();
  }
}

最初に出してる "your text" の部分が中央揃えにならなくて困った。

けど、それは中央揃え関連の指定の後に context.font の指定を置いていたからだった。

中央揃え関連の指定前に context.font の指定を置いてやると最初に出しているテキストにも中央揃えが適用された。