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 相关文章推荐
javascript事件问题
Sep 05 Javascript
超简单JS二级、多级联动的简单实例
Feb 18 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
Feb 26 Javascript
js实现支持手机滑动切换的轮播图片效果实例
Apr 29 Javascript
Node.js用readline模块实现输入输出
Dec 16 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
Jan 05 Javascript
常用的javascript设计模式
Jan 11 Javascript
vue 里面使用axios 和封装的示例代码
Sep 01 Javascript
微信小程序promsie.all和promise顺序执行
Oct 27 Javascript
AngularJs 终极购物车(实例讲解)
Nov 08 Javascript
vue-cli3 DllPlugin 提取公用库的方法
Apr 24 Javascript
微信小程序如何获取群聊的openGid以及名称详解
Jul 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下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
2014/06/22 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
JS处理VBArray的函数使用说明
2008/05/11 Javascript
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
将CKfinder整合进CKEditor3.0的新方法
2010/01/10 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
python实现黑客字幕雨效果
2018/06/21 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
Django网络框架之HelloDjango项目创建教程
2019/06/06 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
如何在python中写hive脚本
2019/11/08 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
彪马法国官网:PUMA法国
2019/12/15 全球购物
关于学习的演讲稿
2014/05/10 职场文书
优秀家长事迹材料
2014/05/17 职场文书
保护地球的标语
2014/06/17 职场文书
电子专业求职信
2014/06/19 职场文书
会计岗位工作总结
2015/08/12 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
解决vue中provide inject的响应式监听
2022/04/19 Vue.js
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript