怎么用canvas画秒针_HTML5 Canvas 绘制时钟

本文介绍了如何使用HTML5 Canvas绘制一个简单的时钟,包括秒针、分针和时针的动态显示。通过JavaScript获取当前时间并转换为角度,结合Canvas API进行绘制,实现了时钟的实时更新效果。
摘要由CSDN通过智能技术生成

网上会看到很多绘制的时钟,看代码也是云里雾里,自学了下Canvas,觉得不难,就自己做了一个。

先看一下截图:

20180925040455980925.jpg

比较简陋,但是该有的都有了,样式只加了个阴影。

html代码就不贴了,就一个canvas。

下面是JS实现:

1、取得上下文:

var clock = document.getElementById(‘clock‘),

context= clock.getContext(‘2d‘);

2、为了方便,先把绘制上下文做一下变换。

移动之前原点在左上角,现在把他移动到中心处,这里我们画上钟表中心。

平移之后,0度在下午三点钟方向,我们把他旋转到12点钟方向,这样时间和角度就是统一的了。

context.translate(150, 150);

context.rotate(-Math.PI / 2);

3、首先绘制个大圆,作为钟表的外轮廓。

因为在上面做了平移,所以圆心就是(0,0),然后最后一个参数是false,表示按顺时针方向绘制,因为旋转过,所以就是从12点方向,顺时针方向绘制了个圆,正好和表的走法是一致的,

这样后面处理起来就方便的多。

context.beginPath();

context.arc(0, 0, 130, 0, Math.PI * 2, false);

context.closePath();

context.stroke();

4、绘制中心的点

context.beginPath();

context.arc(0, 0, 5, 0, Math.PI * 2, false);

context.closePath();

context.fill();

5、绘制小时刻度,12个,角度间隔是30度,这里需要弧度。

x和y的确定需要画图看一下,其实不难。

20180925040456333441.jpg

x也就是半径的sin值,y是cos值。

var angle = 0;

for(var i = 0; i < 12; i++) {

angle+= Math.PI / 6;

context.beginPath();var x = radius *Math.cos(angle),

y= radius *Math.sin(angle);var dx = 10 *Math.cos(angle);

dy= 10 *Math.sin(angle);

context.moveTo(x, y);

context.lineTo(x- dx, y -dy);

context.stroke();

context.closePath();

}

6、绘制分秒的刻度,60个,和上面一样。

var angle = 0;for(var i = 0; i < 60; i++) {

angle+= Math.PI / 30;

context.beginPath();var x = radius *Math.cos(angle),

y= radius *Math.sin(angle);var dx = 3 *Math.cos(angle);

dy= 3 *Math.sin(angle);

context.moveTo(x, y);

context.lineTo(x- dx, y -dy);

context.stroke();

context.closePath();

}

7、接下来就是三根针了,首先获得当前的时间。

小时如果大于12了,我们要减掉12,同时我们会发现,时针不是一下子跳跃的,他也是慢慢的移动到下一个小时的,所以要取得他的准确小时数。

var now = newDate(),

hour=now.getHours(),

minute=now.getMinutes(),

second=now.getSeconds();

hour= hour >= 12 ? hour - 12 : hour;

hour += minute / 60;

8、绘制秒针,可以像上面那样的画个图看看。110是长度,时针和分针的绘制方法是一样的。

var xS = 110 * Math.cos(Math.PI / 30 *second),

yS= 110 * Math.sin(Math.PI / 30 *second);

context.beginPath();

context.moveTo(0, 0);

context.lineTo(xS, yS);

context.stroke();

这样基本就可以了,然后可以简单的把重复的地方封装一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值