这两天在看html5的canvas,实现了上面那个东西
需要注意的地方:
1.canvas的sava()和restore()理解和使用
2.canvas的translate scale rotate ..的使用,每个变化都应该清楚圆心和角度..看:http://blog.sina.com.cn/s/blog_8fab526c01015tqs.html
3.自定义旋转transform方法,实现数字的fillText
View Code
<!DOCTYPE html> <html> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Canvas Clock.</title><script src="jquery-1.7.1.min.js"></script> </head> <style type="text/css">#canvasPanel{margin:0 auto;}#canvas{display: block;} </style> <body> <div id="time"><span>2013-05-11</span></div><div id="canvasPanel"><canvas id="canvas" width="300" height="300" style="border:1px solid #ccc;"></canvas></div><script type="text/javascript">window.onload = function(){clock();var timeInterval = setInterval(clock,1000);};function clock(){var now = new Date();var weekday={0:'星期日',1:'星期一',2:'星期二',3:'星期三',4:'星期四',5:'星期五',6:'星期六'};var sec = now.getSeconds();var min = now.getMinutes();var hr = now.getHours();hr = hr>=12 ? hr-12:hr;ctx = document.getElementById('canvas').getContext("2d");ctx.save();ctx.clearRect(0,0,300,300);ctx.translate(150,150);ctx.scale(0.4,0.4);ctx.rotate(-Math.PI/2); ctx.strokeStyle = "black";ctx.lineWidth = 8;ctx.lineCap = "round";// 时间刻度 ctx.save(); var x = 0, y = 0,angle = Math.PI/30;ctx.rotate(Math.PI/2); //function transform ??function transform(ctx,x,y,angle,b){if(b){ctx.transform(Math.cos(angle), Math.sin(angle),-Math.sin(angle), Math.cos(angle),x*(1-Math.cos(angle)) + x*Math.sin(angle),y*(1-Math.cos(angle)) - y*Math.sin(angle));}}for(var i=0;i<60;i++){if(i%5 == 0){ctx.font = "26px Arial";ctx.fillText(i/5 == 0 ? 12 : i/5,x-15,y-200);}transform(ctx,x,y,angle,true); }ctx.restore();ctx.save();ctx.beginPath();for(var i=0;i<12;i++){ctx.rotate(Math.PI/6);ctx.moveTo(250,0);ctx.lineTo(270,0);}ctx.stroke();ctx.restore();ctx.save();ctx.lineWidth = 5;ctx.beginPath();for(var i=0;i<60;i++){if(i%5!=0){ctx.moveTo(266,0);ctx.lineTo(270,0);}ctx.rotate(Math.PI/30); } ctx.stroke();ctx.restore();//draw the hour line ctx.save();ctx.rotate((Math.PI/6)*hr+(Math.PI/360)*min+(Math.PI/21600)*sec); ctx.beginPath();ctx.moveTo(-20,0);ctx.lineTo(150,0);ctx.stroke();ctx.restore();//draw the min line ctx.save();ctx.rotate((Math.PI/30)*hr+(Math.PI/1800)*min);ctx.strokeStyle = "#fd4000";ctx.fillStyle = "#fd4000";ctx.lineWidth = 6;ctx.beginPath();ctx.moveTo(-28,0);ctx.lineTo(200,0);ctx.stroke();ctx.restore();//draw the sec line ctx.save();ctx.rotate((Math.PI/30)*sec);ctx.strokeStyle = "#D40000";ctx.fillStyle = "#d40000";ctx.lineWidth = 6;ctx.beginPath();ctx.moveTo(-36,0);ctx.lineTo(160,0);ctx.stroke();ctx.restore();//draw the circle ctx.save();ctx.lineWidth = 4;ctx.strokeStyle = "325fa2"ctx.beginPath();ctx.arc(0,0,300,0,Math.PI*2,true);ctx.stroke();ctx.restore();//draw the middle circle ctx.save();ctx.lineWidth = 4;ctx.strokeStyle = "325fa2";ctx.beginPath();ctx.arc(0,0,7,0,Math.PI*2,true);ctx.stroke();ctx.restore();//show time/*ctx.rotate(Math.PI/2);ctx.lineWidth = 2;ctx.fillStyle = "red";hour = now.getHours();var str = hour > 10 ? hour : ("0"+hour)+":"+(min > 10 ? min:("0"+min));ctx.font = "18px";ctx.fillText(str,150,250);ctx.lineWidth = 1; ctx.fillText("Lgm ZJ", 150, 270); */ctx.restore();var dateString=now.getFullYear()+"年"+(now.getMonth()+1)+"月"+now.getDate()+"日 "+weekday[now.getDay()]+" h:"+now.getHours()+" m:"+min+" s:"+sec;$("#time span").html(dateString);}</script> </body></html>