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 处理URL实用技巧
Nov 23 Javascript
JQuery 返回布尔值Is()条件判断方法代码
May 14 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
Mar 20 Javascript
JavaScript获得表单target属性的方法
Apr 02 Javascript
两种JS实现屏蔽鼠标右键的方法
Aug 20 Javascript
Javascript如何判断数据类型和数组类型
Jun 22 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
Jul 22 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
Oct 30 Javascript
详解webpack的配置文件entry与output
Aug 21 Javascript
Vue实现active点击切换方法
Mar 16 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
Jul 06 Javascript
Vue登录注册并保持登录状态的方法
Aug 17 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 魔术方法使用说明
2009/10/20 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
解析dedeCMS验证码的实现代码
2013/06/07 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
PHP 简易输出CSV表格文件的方法详解
2013/06/20 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
php图片添加水印例子
2016/07/20 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
php中关于换行的实例写法
2019/09/26 PHP
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
vue小白入门教程
2018/04/02 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
python删除列表内容
2015/08/04 Python
python 捕获shell脚本的输出结果实例
2017/01/04 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
Python根据成绩分析系统浅析
2019/02/11 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
解决Pycharm 运行后没有输出的问题
2021/02/05 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
传媒专业推荐信范文
2013/11/23 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
调任通知
2015/04/21 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
2016开学第一课心得体会
2016/01/23 职场文书