2011/11/27更新

[HTML5] Canvasを使ってアナログ時計を作成してみた

このエントリーをはてなブックマークに追加            

HTML5のCanvasという描画機能を使って、アナログ時計を作成してみました。
http://www.yoheim.net/のトップページ右側に表示されます。

ページに時計があるページを見て、自分も欲しいとおもい作成しました。
コードは以下です。コード量80行弱とそんなに多くなく出来ました(*´∇`*)

<div style="width:100%; text-align:center;">
  <canvas id="myCanvas" width="100px" height="100px" style="background-color:black;">
  </canvas>
</div>
<script type="text/javascript">
var drawClock = function(){

  var canvas = document.getElementById("myCanvas");
  var c = canvas.getContext("2d");
  var w = canvas.width;
  var h = canvas.height;
  var center = {x : w / 2 - 3, y : h / 2 + 3};
  var lw = canvas.width * 0.8 / 2; // draw Area width.

  // initialize variables.
  c.fillStyle = "#ffffff";
  c.strokeStyle = "#ffffff";
  c.font = "10px 'MS Pゴシック'";

  // clear canvas.
  c.clearRect(0, 0, w, h);

  // draw numbers.
  for (var i = 0; i < 12; i++) {
    var radian = (360 / 12) * i * Math.PI / 180;
    var x = center.x + lw * Math.sin(radian);
    var y = center.y - lw * Math.cos(radian);
    var text = "" + (i == 0 ? "12" : i);
    // alert(text + ", " + x + ", " + y);
    c.fillText(text, x, y);
  }

  // draw needles.
  var now = new Date();
  var hh = now.getHours() - 1;
  var mm = now.getMinutes();
  var ss = now.getSeconds();
  var hh_radian = (360 * hh / 12 + (360 / 12) * (mm / 60)) * Math.PI / 180;
  var mm_radian = (360 * mm / 60 + (360 / 60) * (ss / 60)) * Math.PI / 180;
  var ss_radian = (360 * ss / 60) * Math.PI / 180;

  var pos_h = _calcPoint(center, lw, hh_radian);
  var pos_m = _calcPoint(center, lw, mm_radian);
  var pos_s = _calcPoint(center, lw, ss_radian);

  // hour
  c.beginPath();
  c.moveTo(center.x, center.y);
  c.lineTo(pos_h.x * 0.8, pos_h.y * 0.8);
  c.stroke();
  
  // minute
  c.beginPath();
  c.moveTo(center.x, center.y);
  c.lineTo(pos_m.x, pos_m.y);
  c.stroke();

  // second
  c.strokeStyle = "#ff0000";
  c.beginPath();
  c.moveTo(center.x, center.y);
  c.lineTo(pos_s.x, pos_s.y);
  c.stroke();

}

var _calcPoint = function(center, lineWidth, radian) {
  var pos = {x : center.x + lineWidth * Math.sin(radian), y : center.y - lineWidth * Math.cos(radian)};
  return pos;
}


window.addEventListener("load", function(){
  setInterval(drawClock, 1000);
}, false);
</script>




最後に

ちょっと変なところもあるけど、いったんこれでいいかな。また改善しよう。
HTML5って色々な事が出来て面白いですね。次は何が作れるかなぁ(`・ω・´)






こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。