这个时钟是将钟盘的圆心点移到了 canvas 画布中心点。以方便后面的方位计算

ctx.translate(width/2,height/2);

现定义一个圆盘来显出这个时钟的基本位置

ctx.save()
ctx.beginPath();
ctx.arc(0,0,r+90,0,2*Math.PI,false);
ctx.lineWidth = 200;
ctx.closePath();
ctx.drawImage(img,-r,-r,width,height);
var grd = ctx.createLinearGradient(0,0,0,r);
var r1 = Math.floor(Math.random()*256);19:48:19
var g1 = Math.floor(Math.random()*256);
var b1 = Math.floor(Math.random()*256);
grd.addColorStop(0,"rgb(" + r0 + "," + g0 + "," + b0 + ")");
grd.addColorStop(1,"rgb(" + r1 + "," + g1 + "," + b1 + ")");
ctx.strokeStyle = grd;
ctx.stroke();

我在这里面添加了线性渐变来改变颜色,如果感觉颜色太过绚丽可以注释掉不写。

 var grd1 = ctx.createLinearGradient(0,0,0,r);
var r3 = Math.floor(Math.random()*256);
var g3 = Math.floor(Math.random()*256);
var b3 = Math.floor(Math.random()*256);
grd1.addColorStop(0,"rgb(" + r0 + "," + g0 + "," + b0 + ")");
grd1.addColorStop(1,"rgb(" + r3 + "," + g3 + "," + b3 + ")");

然后利用到了三角函数原理来计算出钟表中刻度的位置;

var x = Math.cos(Math.PI/6*i)*(r-30);
var y = Math.sin(Math.PI/6*i)*(r-30);

然后通过计算来显示出时刻和刻度的分布位置

//                              时刻

                ctx.beginPath();
var arr = ["III","IV","V","VI","VII",'VIII',"IX",'X','XI','XII','I','II'];
ctx.font = "20px Arial";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
var grd2 = ctx.createLinearGradient(0,0,0,r);
var r2 = Math.floor(Math.random()*256);
var g2 = Math.floor(Math.random()*256);
var b2 = Math.floor(Math.random()*256);
grd2.addColorStop(0,"rgb(" + r2 + "," + g2 + "," + b2 + ")");
grd2.addColorStop(1,"rgb(" + r0 + "," + g0 + "," + b0 + ")");
ctx.fillStyle = grd2;
ctx.fill();
ctx.closePath();
for (var i = 0;i < arr.length; i ++){
var x = Math.cos(Math.PI/6*i)*(r-30);
var y = Math.sin(Math.PI/6*i)*(r-30);
ctx.fillText(arr[i],x,y);
} // 刻度
for(var j =0;j < 60;j ++){
var x = Math.cos(Math.PI/30*j)*(r-15);
var y = Math.sin(Math.PI/30*j)*(r-15);
ctx.beginPath();
ctx.arc(x,y,2,0,2*Math.PI,false);
var grd1 = ctx.createLinearGradient(0,0,0,r);
var r3 = Math.floor(Math.random()*256);
var g3 = Math.floor(Math.random()*256);
var b3 = Math.floor(Math.random()*256);
grd1.addColorStop(0,"rgb(" + r0 + "," + g0 + "," + b0 + ")");
grd1.addColorStop(1,"rgb(" + r3 + "," + g3 + "," + b3 + ")");
ctx.fillStyle = grd1;
ctx.fill();
}
ctx.closePath();
}
接下来就是时针、分针和秒针
在这里值得一提的是,秒针在移动的时候是带着分针和时针一起转动的,所以在计算时针的转动角度时,要把分针的也计算在一起,不过分针的计算角度要更新下

var HOUR = Math.PI/6*hour;
var MINU = Math.PI/6/60*minu;

同样的在计算分针时,要带上秒针

var MINU = Math.PI/30*minu;
var SECON = Math.PI/1800*secon;

这样,我们在运行时,就可以看出,分针和时针都是不停的在运转的

//                     小时
function timh(hour,minu){
ctx.save();
ctx.beginPath();
ctx.lineWidth = 6;
var HOUR = Math.PI/6*hour;
var MINU = Math.PI/6/60*minu;
ctx.rotate(HOUR+MINU);
ctx.moveTo(0,10);
ctx.lineTo(0,-r/2);
ctx.lineCap = "round";
var grd3 = ctx.createLinearGradient(0,0,0,r);
var r3 = Math.floor(Math.random()*256);
var g3 = Math.floor(Math.random()*256);
var b3 = Math.floor(Math.random()*256);
grd3.addColorStop(0,"rgb(" + r3 + "," + g3 + "," + b3 + ")");
grd3.addColorStop(1,"rgb(" + r0 + "," + g0 + "," + b0 + ")");
ctx.strokeStyle = grd3;
ctx.stroke();
ctx.restore();
} // 分钟
function timm(minu,secon){
ctx.save();
ctx.beginPath();
ctx.lineWidth = 3;
var MINU = Math.PI/30*minu;
var SECON = Math.PI/1800*secon;
ctx.rotate(MINU+SECON);
ctx.moveTo(0,10);
ctx.lineTo(0,-r+50);
ctx.lineCap = "round";
var grd4 = ctx.createLinearGradient(0,0,0,r);
var r4 = Math.floor(Math.random()*256);
var g4 = Math.floor(Math.random()*256);
var b4 = Math.floor(Math.random()*256);
grd4.addColorStop(0,"rgb(" + r4 + "," + g4 + "," + b4 + ")");
grd4.addColorStop(1,"rgb(" + r0 + "," + g0 + "," + b0 + ")");
ctx.strokeStyle = grd4;
ctx.stroke();
ctx.restore();
} // 秒钟
function tims(secon){
ctx.save();
ctx.beginPath();
var SECON = Math.PI/30*secon;
ctx.rotate(SECON);
ctx.fillStyle = "red"
ctx.moveTo(-2,20);
ctx.lineTo(2,20);
ctx.lineTo(1,-r+20);
ctx.lineTo(-1,-r+20);
ctx.closePath();
ctx.fill();
ctx.restore();
}

在最后为了真实一点,在钟盘中心增加一个固定

function ding(){
ctx.beginPath();
ctx.fillStyle = "#fff";
ctx.arc(0,0,3,0,Math.PI*2);
ctx.closePath();
ctx.fill();
}

最后在添加无限定时器运转

function cleann(){
ctx.clearRect(-r,-r,width,height);
var timer = new Date();
var hour = timer.getHours();
var minu = timer.getMinutes();
var secon = timer.getSeconds(); fun();
timh(hour,minu);
timm(minu,secon);
tims(secon);
ding();
ctx.restore();
}setInterval(cleann,1000);

效果(背景图片可以自行加入)

												

Canvas:时钟的更多相关文章

  1. Coffeescript实现canvas时钟

    前言 参照Mozilla 官方教程,要在Canvas上画动画时钟,思路非常有意思. 把动画看作是多个帧组成,定时每个时间点在Canvas上画一帧来实现动画.而Mozilla 官方教程画图实现的思路有意 ...

  2. 》》canvas时钟

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. 原生js之canvas时钟组件

    canvas一直是前端开发中不可或缺的一种用来绘制图形的标签元素,比如压缩上传的图片.比如刮刮卡.比如制作海报.图表插件等,很多人在面试的过程中也会被问到有没有接触过canvas图形绘制. 定义 ca ...

  4. HTML5之Canvas时钟(网页效果--每日一更)

    今天,带来的是使用HTML5中Canvas标签实现的动态时钟效果. 话不多说,先看效果:亲,请点击这里 众所周知,Canvas标签是HTML5中的灵魂,HTML5 Canvas是屏幕上的一个由Java ...

  5. Canvas - 时钟绘制

    导语:距离上一次写canvas,已经过去两年半,如今业务需要,再次拾起,随手记录. [思考] 时钟的绘制主要在于圆的绘制:1. 使用context.arc()方法直接绘制圆或圆弧: 2. 使用圆的方程 ...

  6. html5 canvas时钟

    基础知识点:                canvas标签只是图形容器,您必须使用脚本来绘制图形. getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性.——获取上 ...

  7. canvas时钟效果

    话不多说,直接上代码 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/x ...

  8. HTML5 Canvas 时钟

    1. [图片] QQ截图20120712130049.png ​2. [代码][HTML]代码 <!DOCTYPE html><html lang="en" &g ...

  9. 简单的canvas时钟

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. canvas 时钟+自由落体

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

随机推荐

  1. 使用poi读取Excel文件数据

    package com.haiyisoft.iecp.util; import java.io.File;import java.io.FileInputStream;import java.io.F ...

  2. return和throw某些特性相似

    拷贝构造函数的调用拷贝构造函数会在以下三中情况下被调用(1)当类的一个对象去初始化该类的另一个对象时 int main(){ Point a(1,2); Point b(a);//用对象a初始化对象b ...

  3. 实战深度学习(上)OpenCV库

    在如今人工智能的浪潮下,无数模拟机器学习和深度学习的开发者工具倍出,其中在计算机图形学和计算机视觉里面最流行的一个库就是OpenCV库了.计算机图形学和计算机视觉学在我们的自动驾驶和仿生机器人当中有着 ...

  4. 【安富莱】【RL-TCPnet网络教程】第7章 RL-TCPnet网络协议栈移植(裸机)

    第7章        RL-TCPnet网络协议栈移植(裸机) 本章教程为大家讲解RL-TCPnet网络协议栈的裸机移植方式,学习了上个章节讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文 ...

  5. SDL 开发实战(六): 使用 SDL 实现 YUV 播放器

    前面铺垫了这么多,现在终于进入核心的主题了,那就是使用SDL播放视频,本节我们将使用SDL播放YUV视频,也就是做一个YUV播放器. 下面说明一下使用SDL播放YUV视频的基本流程,主要分为两大部分: ...

  6. java前后分离使用fetch上传文件失败500

    这次不是写什么技术要点,仅仅是记录一下 最近遇到的一个问题 背景 使用fetch向java后台上传文件时,前端调试报错500,后端的报错为multipart 无法解析,翻译过来大概是这个意思. 由于本 ...

  7. [Swift]LeetCode667. 优美的排列 II | Beautiful Arrangement II

    Given two integers n and k, you need to construct a list which contains n different positive integer ...

  8. [Swift]LeetCode796. 旋转字符串 | Rotate String

    We are given two strings, A and B. A shift on A consists of taking string A and moving the leftmost ...

  9. webpack的基本配置项

    const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin& ...

  10. vue框架中的Axios封装

      function axios(options) {     let promise = new Promise((resolve, reject) => {         var xhr ...