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 相关文章推荐
关于extjs treepanel复选框选中父节点与子节点的问题
Apr 02 Javascript
分析Node.js connect ECONNREFUSED错误
Apr 09 Javascript
解析javascript 数组以及json元素的添加删除
Jun 26 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
Dec 15 Javascript
JavaScript获取Url里的参数
Dec 18 Javascript
jQuery操作iframe中js函数的方法小结
Jul 06 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
Aug 21 Javascript
vue-cli3.0 特性解读
Apr 22 Javascript
浅谈在Vue.js中如何实现时间转换指令
Jan 06 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
Jul 16 jQuery
vue(2.x,3.0)配置跨域代理
Nov 27 Javascript
浅析vue中的nextTick
Dec 28 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图片上传程序
2008/03/27 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
jQuery的事件预绑定
2016/12/05 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
详解Vue 2.0封装axios笔记
2017/06/22 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
Javascript组合继承方法代码实例解析
2020/04/02 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
极简的Python入门指引
2015/04/01 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
2019/03/11 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
联想马亚西亚官方网站:Lenovo Malaysia
2018/09/19 全球购物
电子商务自荐书范文
2014/01/04 职场文书
个人先进事迹材料
2014/12/29 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
vue修饰符.capture和.self的区别
2022/04/22 Vue.js