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


Posted in Javascript onSeptember 12, 2017

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

先来看看运行效果:

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

完整实例代码:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>3water.com 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 相关文章推荐
JS画线(实例代码)
Nov 20 Javascript
vue实现移动端图片裁剪上传功能
Aug 18 Javascript
Vue CLI3 开启gzip压缩文件的方式
Sep 30 Javascript
详解mpvue scroll-view自动回弹bug解决方案
Oct 01 Javascript
小程序实现列表点赞功能
Nov 02 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
Apr 09 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
Apr 24 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
Apr 06 Javascript
微信小程序拖拽排序列表的示例代码
Jul 08 Javascript
vue中v-model对select的绑定操作
Aug 31 Javascript
jQuery实现简单三级联动效果
Sep 05 jQuery
antd中table展开行默认展示,且不需要前边的加号操作
Nov 02 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
Sep 12 #Javascript
Angular 4.0学习教程之架构详解
Sep 12 #Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 #jQuery
详解vue axios中文文档
Sep 12 #Javascript
javascript算法之二叉搜索树的示例代码
Sep 12 #Javascript
vue-resouce设置请求头的三种方法
Sep 12 #Javascript
vue params、query传参使用详解
Sep 12 #Javascript
You might like
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
php中异常处理方法小结
2015/01/09 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
理解javascript中的回调函数(callback)
2014/09/02 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
微信小程序实现根据字母选择城市功能
2017/08/16 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
简单了解django orm中介模型
2019/07/30 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
流动人口婚育证明
2014/10/19 职场文书
2014年采购工作总结
2014/11/20 职场文书
财产保全担保书
2015/01/20 职场文书
超市采购员岗位职责
2015/04/07 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
如何用python插入独创性声明
2021/03/31 Python