HTML5 Canvas绘制实时时钟

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>try to draw the colock</title>
 <script src="js/modernizr-1.7.js"></script>
 <script type="text/javascript">
  window.addEventListener("load",eventWindowLoaded,false);
  function eventWindowLoaded(){
    canvasApp();
  }
  function canvasSupport()   //检测浏览器是否支持canvas属性
  {
  	return Modernizr.canvas;
  }

  function canvasApp(){
  	if(!canvasSupport()){
  		return;
  	}else{
  		var theCanvas=document.getElementById("canvas");  
  		var context=theCanvas.getContext('2d');  //获取2d上下文
  	}
   var clockRadius=50;     //时钟原型半径
   var clockImage=new Image();
   clockImage.addEventListener("load",eventCfaceLoaded,false);   //添加事件
   clockImage.src="images/cface.png";          
   function eventCfaceLoaded(){
   	startUp();
   }

   function startUp(){
    setInterval(drawScreen,1000);   //设置一个定时器,进行画布的不断重绘
   }

  function clear() { // clear canvas function
      context.clearRect(0, 0, context.canvas.width, context.canvas.height);   //清除画布内容
  }
   function drawScreen()
   {
    clear();

    var date=new Date();
    var hours=date.getHours();
    var minutes=date.getMinutes();
    var seconds=date.getSeconds();
    hours=hours>12?hours-12:hours;
    var hour=hours+minutes/60;
    var minute=minutes+minutes/60;

    context.save();    //保存画布内容

    context.drawImage(clockImage,0,0,100,100);
    context.translate(theCanvas.width/2,theCanvas.height/2);
    context.beginPath();   //开始绘制

    //draw number
    context.fillStyle="#000";
    context.font="10px Arial";
    context.textAlign="center";
    context.textBaseline="middle";

    for(var n=1;n<=12;n++){
      var theta=(n-3)*(Math.PI*2)/12;  //绘制1-12数字的位置,自己结合坐标轴想想就知道为什么是n-3了
      var x=clockRadius*0.7*Math.cos(theta);
      var y=clockRadius*0.7*Math.sin(theta);
      context.fillText(n,x,y);  //绘制数字

    }
    context.save();  //保存画布内容

    var theta=(hour-3)*2*Math.PI/12;
     context.rotate(theta);
     context.beginPath();
     context.moveTo(-10,-3);
     context.lineTo(-10,3);
     context.lineTo(clockRadius*0.5,1);
     context.lineTo(clockRadius*0.5,-1);
     context.fill();
     context.restore();

     context.save();

     var theta=(minute-15)*Math.PI*2/60;
     context.rotate(theta);

     context.beginPath();
     context.moveTo(-10,-2);
     context.lineTo(-10,2);
     context.lineTo(clockRadius*0.7,1);
     context.lineTo(clockRadius*0.7,-1);
     context.fill();
     context.restore();

    context.save();
    var theta = (seconds - 15) * 2 * Math.PI / 60;
    context.rotate(theta);
    context.beginPath();
    context.moveTo(-10, -2);
    context.lineTo(-10, 2);
    context.lineTo(clockRadius * 0.8, 1);
    context.lineTo(clockRadius * 0.8, -1);
    context.fillStyle = '#0f0';
    context.fill();
    context.restore();

    context.restore();

   }
}

 </script>
 <style type="text/css">
 body{margin: 0px;padding: 0px;background-color: #eee;font-size: 4px Arial,sans-serif;}
 .clocks{height: 100px;width: 100px;margin: 25px auto;}
 </style>
</head>
<body>
	<div class="clocks" style="position:absolute;top:50px;left:50px;">
		<canvas id="canvas" width="100" height="100" >
			your broswer is not support HTML5!
		</canvas>
	</div>
</body>
</html>


补充说明:

save是保存当前绘图状态,并把它压入一个堆栈 
restore是恢复上次保存的绘图状态,从堆栈弹出。 
关键在于绘图状态,它是指Canvas的平移、放缩、旋转、错切、裁剪等操作或者颜色、线条等样式。 

beginPath()和closePath()也就是绘制线的开始和结束

HTML5 Canvas绘制实时时钟,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。