Coffeescript实现canvas时钟

前言

  参照Mozilla 官方教程,要在Canvas上画动画时钟,思路非常有意思。

  把动画看作是多个帧组成,定时每个时间点在Canvas上画一帧来实现动画。而Mozilla 官方教程画图实现的思路有意思的地方在于,它喜欢在画布上面做文章,正常的思路,如果要画一条倾斜45度的直线,一般会先用数据计算拿到起始点与末点的坐标,先定位到起点画线到末点;如何在画布上面做文章呢,它先把画布旋转45度,然后直接在中间画一条竖线,再把画布复原,这样直线也跟着倾斜45度了。就按这思路定时在Canvas上画点、线、面实现时钟动画。

页面效果如下

原代码如下

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>canvas时钟 - Coffeescript实现</title>
    <script id="others_zepto_10rc1" type="text/javascript" class="library" src="/js/sandbox/other/zepto.min.js"></script>
    <script id="others_coffeescript" type="text/javascript" class="library" src="/js/sandbox/other/coffee-script.js"></script>
    </head>
    <body>
        <canvas id="canvas"></canvas>
        <h2>
            Coffeescript 练习
        </h2>
        <p>
            Canvas时钟 - Coffeescript实现
        </p>
        <p>
            参照 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Basic_animations">An animated clock</a>
        </p>        
    </body>
<script type="text/coffeescript">
clock = ->
  now = new Date()
  ctx = document.getElementById('canvas').getContext '2d'
  ctx.save()
  ctx.clearRect 0,0,150,150
  ctx.translate 75,75
  ctx.scale 0.4,0.4
  ctx.rotate -Math.PI/2
  ctx.strokeStyle = "black"
  ctx.fillStyle = "white"
  ctx.lineWidth = 8
  ctx.lineCap = "round"
  
  #画12个小时的标刻
  ctx.save()
  for i in [0..11]
    ctx.beginPath()
    ctx.rotate Math.PI/6
    ctx.moveTo 100,0
    ctx.lineTo 120,0
    ctx.stroke()
  ctx.restore()
  
  #画60个分钟的标刻
  ctx.save()
  ctx.lineWidth = 5
  for i in [0..59]
    if i%5 isnt 0 
      ctx.beginPath()
      ctx.moveTo 117,0 
      ctx.lineTo 120,0
      ctx.stroke()
    ctx.rotate Math.PI/30
  ctx.restore()  

  sec = now.getSeconds()
  min = now.getMinutes()
  hr  = now.getHours()
  hr = if hr >= 12 then hr-12 else hr

  ctx.fillStyle = "black"

  #画时针
  ctx.save()
  ctx.rotate hr*(Math.PI/6) + (Math.PI/360)*min + (Math.PI/21600)*sec
  ctx.lineWidth = 14
  ctx.beginPath()
  ctx.moveTo -20,0
  ctx.lineTo 80,0
  ctx.stroke()
  ctx.restore()

  #画分针
  ctx.save()
  ctx.rotate (Math.PI/30)*min + (Math.PI/1800)*sec
  ctx.lineWidth = 10
  ctx.beginPath()
  ctx.moveTo -28,0
  ctx.lineTo 112,0
  ctx.stroke()
  ctx.restore()

  #画秒针 
  ctx.save()
  ctx.rotate sec * Math.PI/30
  ctx.strokeStyle = "#D40000"
  ctx.fillStyle = "#D40000"
  ctx.lineWidth = 6
  ctx.beginPath()
  ctx.moveTo -30,0
  ctx.lineTo 83,0
  ctx.stroke()
  ctx.beginPath()
  ctx.arc 0,0,10,0,Math.PI*2,true
  ctx.fill()
  ctx.beginPath()
  ctx.arc 95,0,10,0,Math.PI*2,true
  ctx.stroke()
  ctx.fillStyle = "rgba(0,0,0,0)"
  ctx.arc 0,0,3,0,Math.PI*2,true
  ctx.fill()
  ctx.restore()
  
  #画钟的外圈
  ctx.beginPath()
  ctx.lineWidth = 14
  ctx.strokeStyle = '#325FA2'
  ctx.arc 0,0,142,0,Math.PI*2,true
  ctx.stroke()
  ctx.restore()

  window.requestAnimationFrame clock
  return

#启动程序
clock()    
    </script>
</html>

参考自 An animated clock

posted @ 2015-11-24 10:33  Fast Mover  阅读(...)  评论(...编辑  收藏
友情链接: 泡妞秘籍 | A4纸尺寸 | 卡通头像 | +申请友情链接