Canvas实现的动态时钟

Canvas实现的动态时钟

实验室杨老大给的假期任务,不管用什么方式实现一个动态的时钟。
因为我是弄web的来着,思前想后比较容易的实现方式就canvas或者css3了,所以就决定用canvas画个时钟出来。

canvas

Canvas 对象表示一个 HTML 画布元素 canvas。它没有自己的行为,但是定义了一个 API 支持脚本化客户端绘图操作,用自带的api进行画图操作。
首先我们在body里面定义一个canvas对象

<canvas id="canvas" style="border:1px solid black;margin:50px auto;display:block" >
            当前浏览器不支持Canvas,请更换浏览器后再试
</canvas>

运用canvas画图

构建环境

<script type="text/javascript">
  var canvas = document.getElementById("canvas");//找到画布对象
  canvas.width = 800;  //画布的长
  canvas.height = 800;  //画布的宽
  var ctx = canvas.getContext("2d");  //构建2d环境
  
</script>

弄好环境之后就可以进行画图了

定义一个画图的函数

  function drawClock(){
    ctx.clearRect(0,0,500,500);先清空片矩形区域
    var now = new Date();//获取系统时间
    var second =now.getSeconds();  
    var minute =now.getMinutes();  
    var hour1 =now.getHours();  
    //获取时分秒
    var hour=hour1+minute/60;  
    hour=hour>12 ?hour-12:hour;  //将24小时转换成12小时

然后继续在这个函数里面画一个圆,用来当做表盘

    ctx.beginPath(); //开始画图
    ctx.lineWidth=8;     //线的宽度  
    ctx.strokeStyle="black";  //线的颜色
    ctx.arc(400,400,200,0,360,false); //画一个圆在(400,400)的位置上,半径为200px
    
    ctx.stroke();   //填充线圈
    ctx.closePath();   //结束这一阶段的操作

效果图


之后就是画表盘上的刻度 分别是小时和分钟

   for(var i = 0;i<12;i++){
        ctx.save();  //保存当前状态  
        ctx.lineWidth=5;   //刻度粗细  
        ctx.strokeStyle="black" ; //刻度颜色  
        ctx.translate(250,250);  //设置00点,以画布中心为00  
        ctx.rotate(i*30*Math.PI/180);  //设置旋转角度 参数是弧度,角度 0--360 弧度角度*Math.PI/180  
        ctx.beginPath();  
        ctx.moveTo(0,-170);   //刻度起始点  
        ctx.lineTo(0,-195);    //刻度结束点  
        ctx.closePath();  
        ctx.stroke();  
        ctx.restore();   //将旋转后的图片返回原画布  
    }
    for(var i=0;i<60;i++){  
        ctx.save();          //保存当前状态  
        ctx.lineWidth=3;   //刻度粗细  
        ctx.strokeStyle="black"    //刻度颜色  
        ctx.translate(250,250);   //设置00点,以画布中心为00  
        ctx.rotate(i*6*Math.PI/180);    //设置旋转角度 参数是弧度,角度 0--360 弧度角度*Math.PI/180  
        ctx.beginPath();  
        ctx.moveTo(0,-186);    //起始点  
        ctx.lineTo(0,-195);    //终点
        ctx.closePath();  
        ctx.stroke();  
        ctx.restore();    //将旋转后的图片返回原画布  
    } 

效果图


画完之后我们就可以画时针,分针,秒针了.

    //表盘中兴的点
    ctx.beginPath();  
    ctx.lineWidth=1;  
    ctx.strokeStyle="black";  
    ctx.fillStyle="blue";
    //路径函数 x,y,r,角度范围,顺时针/逆时针
    ctx.arc(250,250,8,0,360,false);  
    ctx.fill();  
    ctx.stroke();   
    ctx.closePath();    
//时针  
     ctx.save(); //保存当前状态   
     ctx.lineWidth=6;  
     ctx.strokeStyle="black";  
     //设置异次元空间00点  
     ctx.translate(250,250);  
     ctx.rotate(hour*30*Math.PI/180);  //设置旋转角度 参数是弧度,角度 0--360  弧度角度*Math.PI/180  
     ctx.beginPath();       
     ctx.moveTo(0,-120);  //起始
     ctx.lineTo(0,10);    //终点
     ctx.closePath();  
     ctx.stroke();  
     ctx.restore();  
//分针  
     ctx.save();  
     ctx.lineWidth=4;  
     ctx.strokeStyle="green";  
     ctx.translate(250,250);  
     ctx.rotate(minute*6*Math.PI/180);  
     ctx.beginPath();       
     ctx.moveTo(0,-150);  
     ctx.lineTo(0,15);  
     ctx.closePath();  
     ctx.stroke();  
     ctx.restore();  
//秒针
     ctx.save();  
     ctx.lineWidth="1.5";  
     ctx.strokeStyle="red";  
     ctx.translate(250,250);  
     ctx.rotate(second*6*Math.PI/180);  
     ctx.beginPath();       
     ctx.moveTo(0,-160);  
     ctx.lineTo(0,20);  
     ctx.closePath();  
     ctx.stroke();  
     //秒针前端小点  
     ctx.beginPath();  
     //外环为红色  
     ctx.strokeStyle="red";  
     //灰色填充  
     ctx.fillStyle="black";  
     ctx.arc(0,-80,4,0,360,false);  
     ctx.fill();  
     ctx.closePath();  
     ctx.stroke();  
     ctx.restore(); 
}

通过系统时间的数值来判断直线的偏转度来构成时针,分针和秒针的偏转。

效果图


之后只要不断的动态刷新drawClock()这个函数,就可以动态的显示时间了

   drawClock();   //调用函数
   setInterval(drawClock,1000); //定时器,没1000毫秒刷新一次函数  

至此我们的动态时钟就完成了

附上一个效果的地址

传送门

总结

在web端,做一个动态的时钟还是不怎么难的,运用canvas之后只要熟记语法规则,基本都可以做出来的
有几个常用的canvas api的总结
beginPath()开始绘制常常与closePath()一起用,用于开始和结束的标志
lineWidth:线的宽度
strokeStyle()线的颜色
arc(x,y,r,0,cot,方向)绘制曲线
save()保存上个的绘图环境
translate()设置旋转角度,参数是弧度
fill()填充颜色
restore()旋转后返回画布
绘制一条线的moveTo()起点 和 lineTo()终点
大概一些常用的就这么多了吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容