当前位置: 移动技术网 > IT编程>开发语言>JavaScript > JS+canvas绘制的动态机械表动画效果

JS+canvas绘制的动态机械表动画效果

2017年12月12日  | 移动技术网IT编程  | 我要评论

本文实例讲述了js+canvas绘制的动态机械表动画效果。分享给大家供大家参考,具体如下:

先来看看运行效果:

完整实例代码:

<!doctype html>
<html>
<head lang="en">
  <meta charset="utf-8">
  <title>www.jb51.net canvas时钟</title>
  <style>
    canvas {
      border: 1px solid red;
    }
  </style>
</head>
<body>
<canvas width="800" height="600"></canvas>
</body>
<script>
  function clock(opt) {
    for (var key in opt) {
      this[key] = opt[key];
    }
    this.init();
  }
  clock.prototype = {
    init: function () {
      var self = this;
      var ctx = this.ctx;
      this.timer = setinterval(function(){
        ctx.clearrect(0,0,ctx.canvas.width,ctx.canvas.height);
        self.drawdial();
        self.drawdegreescale();
        self.drawnumber();
        self.drawpointers();
      },1000);
    },
    drawdial: function () {
      var ctx = this.ctx;
      ctx.save();
      ctx.beginpath();
      ctx.linewidth = this.clockdialw;
      ctx.strokestyle = this.clockdialcolor;
      ctx.arc(this.clockx, this.clocky, this.clockradius, 0, 2 * math.pi);
      ctx.stroke();
      ctx.restore();
    },
    drawdegreescale: function () {
      var ctx = this.ctx;
      var clockradius = this.clockradius;
      var clockx = this.clockx;
      var clocky = this.clocky;
      var bigdegreescalel = this.bigdegreescalel;
      var smalldegreescale = this.smalldegreescale;
      var startx, starty, endx, endy, radian;
      ctx.save();
      for (var i = 0; i < 12; i++) {
        radian = i * math.pi / 6;
        endx = clockx + clockradius * math.cos(radian);
        endy = clocky + clockradius * math.sin(radian);
        if (radian % (math.pi / 2) == 0) {
          startx = clockx + (clockradius - bigdegreescalel) * math.cos(radian);
          starty = clocky + (clockradius - bigdegreescalel) * math.sin(radian);
          ctx.linewidth = this.bigdcwidth;
        } else {
          startx = clockx + (clockradius - smalldegreescale) * math.cos(radian);
          starty = clocky + (clockradius - smalldegreescale) * math.sin(radian);
          ctx.linewidth = this.smalldcwidth;
        }
        ctx.beginpath();
        ctx.moveto(startx, starty);
        ctx.lineto(endx, endy);
        ctx.stroke();
        ctx.restore();
      }
    },
    drawnumber: function () {
      var ctx = this.ctx;
      var textx, texty, textradian;
      var clockx = this.clockx;
      var clocky = this.clocky;
      var clockradius = this.clockradius;
      ctx.font = '20px 微软雅黑';
      ctx.fillstyle = 'red';
      ctx.textalign = 'center';
      ctx.textbaseline = 'middle';
      ctx.save();
      for (var i = 0; i < 12; i++) {
        textradian = i * math.pi / 6 - math.pi/3;
        textx = clockx + (clockradius - 40) * math.cos(textradian);
        texty = clocky + (clockradius - 40) * math.sin(textradian);
        ctx.beginpath();
        ctx.filltext(i + 1, textx, texty);
      }
      ctx.restore();
    },
    drawpointers: function () {
      var date = new date();
      var h = date.gethours();
      var m = date.getminutes();
      var s = date.getseconds();
      h = h % 12;
      var hradian = 2 * math.pi / 12 * h - math.pi / 2;
      this.drawpoint(hradian,30,'red',8);
      var mradian = 2 * math.pi / 60 * m - math.pi / 2;
      this.drawpoint(mradian,50,'blue',6);
      var sradian = 2 * math.pi / 60 * s - math.pi / 2;
      this.drawpoint(sradian,70,'green',2);
    },
    drawpoint: function (radian, length,color,linewidth) {
      var x = this.clockx + math.cos(radian) * length;
      var y = this.clocky + math.sin(radian) * length;
      var ctx = this.ctx;
      ctx.save();
      ctx.beginpath();
      ctx.strokestyle = color;
      ctx.linewidth = linewidth;
      ctx.moveto(this.clockx,this.clocky);
      ctx.lineto(x,y);
      ctx.stroke();
      ctx.restore();
    }
  };
</script>
<script>
  var canvas = document.queryselector('canvas');
  var ctx = canvas.getcontext('2d');
  var clock = new clock({
    ctx: this.ctx,
    clockradius: 150,
    clockx: 300,
    clocky: 300,
    clockdialw: 6,
    clockdialcolor: 'blue',
    bigdegreescalel: 20,
    bigdcwidth: 6,
    smalldegreescale: 10,
    smalldcwidth: 4
  });
</script>
</html>

更多关于javascript相关内容感兴趣的读者可查看本站专题:《javascript+html5特效与技巧汇总》、《javascript动画特效与技巧汇总》、《javascript图形绘制技巧总结》、《javascript切换特效与技巧总结》、《javascript错误与调试技巧总结》、《javascript数据结构与算法技巧总结》及《javascript数学运算用法总结

希望本文所述对大家javascript程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网