PhoneGapとCanvas

ふと、思いついて、何か作ってみようと思って。
そんで、Cancasにちょろっと描画しようと思ったら、あら大変。

なんか、線描いたら滲んでるように見えたんでんすよね。

    // id="mycanvas"である、canvas要素を確保
    var canvas = $( '#mycanvas' )[0];

    var ctx = canvas.getContext( '2d' );
    ctx.lineWidth = 1;

    // 白でクリア
    ctx.fillStyle = "rgb(255, 255, 255)";
    ctx.fillRect( 0, 0, canvas.width, canvas.height );

    // 黒で水平ラインと、垂直ラインを引く
    ctx.strokeStyle = "rgb(0, 0, 0)";
    ctx.beginPath();
    ctx.moveTo( 20, 20 );
    ctx.lineTo( 320, 20 );
    ctx.moveTo( 20, 30 );
    ctx.lineTo( 20, 300 );
    ctx.stroke();

で、これをiOSシミュレータで見ると、ちょっと太く見えるわけですね。
あれ?って思って、ctx.lineWidth = 1;を追加しても改善されず。

で、このページを見つけて、調整してみました。

HTML5 Canvasのブラウザによって異なる微妙な振る舞いについてまとめてみた。
http://d.hatena.ne.jp/mindcat/20100815/1281877127

iOS上のSafariにおける注意点

  • 水平ラインの始点は、y座標のみピクセルの中央にくるように0.5足す
  • 垂直ラインの始点は、x座標のみピクセルの中央にくるように0.5足す
  • strokeRectでは、左上の座標をピクセルの中央にする

なので、以下のように設定するといい感じになる。

    // 黒で水平ラインと、垂直ラインを引く
    ctx.strokeStyle = "rgb(0, 0, 0)";
    ctx.beginPath();
    ctx.moveTo( 20, 20.5 );
    ctx.lineTo( 320, 20.5 );
    ctx.moveTo( 20.5, 30 );
    ctx.lineTo( 20.5, 300 );
    ctx.stroke();

でも、まだまだ、やっぱ分からないことが多くて、
仕様書とか読めばいんですけどね、ほんとは。
さっきも、ラインの終点は描画されるのか、されないのか調べて、
ラインの終点ピクセルが描画されていないのを確認しました。
arc関数の中心もピクセルの中央のじゃなきゃいけないのかな?とか、
ひとつひとつ確認してみようと思います。

おしまい。

Leave a Comment