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 相关文章推荐
IE8 下的Js错误HTML Parsing Error...
Aug 14 Javascript
小议javascript 设计模式 推荐
Oct 28 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
Nov 28 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
Sep 04 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
Jan 08 Javascript
AngularJs 60分钟入门基础教程
Apr 03 Javascript
使用Ajax生成的Excel文件并下载的实例
Nov 21 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
Jul 06 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 jQuery
在vue项目中使用sass的配置方法
Mar 20 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
Sep 07 Javascript
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
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编程注意事项的小结
2013/04/27 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
php框架知识点的整理和补充
2021/03/01 PHP
Js 本页面传值实现代码
2009/05/17 Javascript
基于Jquery的温度计动画效果
2010/06/18 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
vue系列之requireJs中引入vue-router的方法
2018/07/18 Javascript
详解如何在nuxt中添加proxyTable代理
2018/08/10 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
大学应届毕业生个人求职信
2013/09/23 职场文书
水利学院求职自荐书
2014/02/01 职场文书
电力公司个人求职信范文
2014/02/04 职场文书
六一节目主持词
2014/04/01 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
环保倡议书400字
2014/05/15 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
2015大学自主招生自荐信范文
2015/03/04 职场文书
个人求职自荐信范文
2015/03/06 职场文书
大学生活委员竞选稿
2015/11/21 职场文书
Nginx缓存设置案例详解
2021/09/15 Servers
MySQL常见优化方案汇总
2022/01/18 MySQL
MySQL学习必备条件查询数据
2022/03/25 MySQL