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 相关文章推荐
页面中iframe相互传值传参
Dec 13 Javascript
Javascript和Java获取各种form表单信息的简单实例
Feb 14 Javascript
JS+CSS实现美化的下拉列表框效果
Aug 11 Javascript
JavaScript操作HTML元素和样式的方法详解
Oct 21 Javascript
详解AngularJS中的filter过滤器用法
Jan 04 Javascript
基于javascript显示当前时间以及倒计时功能
Mar 18 Javascript
使用BootStrap实现悬浮窗口的效果
Dec 13 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
Feb 22 Javascript
微信小程序 图片宽度自适应的实现
Apr 06 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
Apr 26 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
Nov 12 Javascript
深入了解Vue3模板编译原理
Nov 19 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
在PWS上安装PHP4.0正式版
2006/10/09 PHP
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
PHP取进制余数函数代码
2012/01/19 PHP
请离开include_once和require_once
2013/07/18 PHP
PHP生成条形图的方法
2014/12/10 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
Auntion-TableSort国人写的一个javascript表格排序的东西
2007/11/12 Javascript
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
Exjs 入门篇
2010/04/07 Javascript
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
跟老齐学Python之正规地说一句话
2014/09/28 Python
Python常用模块介绍
2014/11/21 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
python数据抓取3种方法总结
2021/02/07 Python
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
乌鸦喝水教学反思
2014/02/07 职场文书
文明风采获奖感言
2014/02/18 职场文书
《唯一的听众》教学反思
2014/02/20 职场文书
《骆驼和羊》教学反思
2014/02/27 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
工会工作个人总结
2015/03/03 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
小学生节约用水倡议书
2019/08/12 职场文书