这两天大概看了一下canvas的绘图方式,决定先做一个时钟练练手,以前数学没学好,计算圆坐标的公式完全不会,在绘制刻度的地方花费了很多时间,在此记录下整个步骤,方便以后参考。你可以点击这里查看demo

准备工作:先分析时钟的组成部件:

1.表盘:由五个圆形叠加

2.刻度:2种直线

3.数字:1-12

4.指针:3种直线

5.日历:矩形+数字

一、首先建立画布

html:

js:

二:绘制表盘:

1.因为表盘是由若干个圆形组成的,所以这里先定义一个绘制圆形的函数:

grdcircle(a,b,半径,渐变色1,渐变色2);

2.使用刚才建立的函数依次绘制四个不同大小的圆形,并用渐变色填充

 

三、绘制刻度

刻度是圆上某点到圆心的连线上的一小截线段,将整个圆分为60等份,则每个刻度到圆心的连线之间的夹角为360°/60=6°

已知圆上任意点的坐标公式为:

x=a+r*sin(c*π/180);
y=b+r*sin(c*π/180);

(a,b)=圆心坐标,r=半径,c=圆心角

圆心坐标,半径和圆心角都是已知,那么现在只要计算出点A和点B的坐标,就可以画出刻度了,这里使用for循环,每隔6°画一条点A(t,u)到点B(v,c)的线段;

scale(半径,宽度);

 

这样画出来每一个刻度都一样长,但因为钟表刻度每5个刻度是一条长线段,所以还要判断当前刻度值/30是否是整数,如果是整数,则绘制一条长度12,宽度2的粗线,如果不是则绘制长度6,宽度1的细线。

这里先定义一个判断整数的函数

 

重新写一遍,加入判断:

 

四、绘制数字

每隔5个刻度依次输出数字0-12,输出字符的坐标在对应的圆上,数字的坐标计算方法和画刻度差不多,这里就不多讲了,需要注意的一点是与刻度0对应的点坐标在三点钟位置,与实际不符,这里计算时要先把刻度值减掉15,让0刻度对应点坐标处于12点方向。

clocknumber(半径,颜色,字体样式);

 

五、绘制表针

表针是圆上某点到圆形的连线,也和刻度的画法差不多,这里先定义一个绘制从圆心到某点的线段的函数

strokeline(半径,宽度,颜色,角度);

再定义绘制指针的函数,这里注意时分秒都要换算成小数,如果:1分30秒换算为1.5分钟。

hour(小时,分钟,长度);

minute(分钟,秒,长度);

second(秒,长度);

定义获取当前时间、日期、星期的函数:

绘制表针:

 

六、绘制日历

日历由两部分组成,若干个矩形和星期及日期的文字,这里先定义绘制矩形和文字的函数

矩形:fillerect(x,y,a,b,宽度,颜色);

文字:fillText(x,y,颜色,样式,文本内容,对齐方式);

绘制日历:

 

7、添加一些别的文字

这里可以自由发挥,用刚才定义的绘制文字函数即可,这里要注意下绘制的顺序,不要遮挡到其它元素。

 

 

8.让时钟动起来!

到这一步,时钟的外观已经完成,但是是不会动的,需要每隔一段时间获取下当前时间并重新绘制图形,我们把刚才所有绘制图形的操作放在一个函数里,然后每隔一段时间执行一次这个函数。

 

用setInterval每隔200毫秒执行一次:

到这里这个canvas的钟表就已经绘制完成,可以动起来了!

 

ps:我又增加了一个缩放函数,可以将画布缩放至指定宽度:

将画布缩放至600