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 相关文章推荐
JQuery的$命名冲突详细解析
Dec 28 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
Feb 20 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
Nov 22 Javascript
深入理解关于javascript中apply()和call()方法的区别
Apr 12 Javascript
ionic开发中点击input时键盘自动弹出
Dec 23 Javascript
JS仿JQuery选择器功能
Mar 08 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
Jun 21 Javascript
ES6中数组array新增方法实例总结
Nov 07 Javascript
JS中用EL表达式获取上下文参数值的方法
Mar 28 Javascript
vue.js将时间戳转化为日期格式的实现代码
Jun 05 Javascript
angular5 子组件监听父组件传入值的变化方法
Sep 30 Javascript
jQuery实现的分页插件完整示例
May 26 jQuery
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实现小型站点广告管理(修正版)
2006/10/09 PHP
PHP在字符串中查找指定字符串并删除的代码
2008/10/02 PHP
php利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
Django使用多数据库的方法
2017/09/06 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
python判断端口是否打开的实现代码
2013/02/10 Python
Python数据类型之List列表实例详解
2019/05/08 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
高中班长自我鉴定
2013/12/20 职场文书
复核员上岗演讲稿
2014/01/05 职场文书
区三好学生主要事迹
2014/01/30 职场文书
超市开店计划书
2014/04/26 职场文书
运动会方阵口号
2014/06/07 职场文书
专题组织生活会方案
2014/06/15 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL
Golang二维数组的使用方式
2021/05/28 Golang
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers