HTML5 Canvas绘制实时时钟

7 篇文章 0 订阅
1 篇文章 0 订阅
<!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()也就是绘制线的开始和结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的HTML5 Canvas绘制时钟的示例代码: ``` <!DOCTYPE html> <html> <head> <title>Canvas时钟</title> <style> canvas { border: 2px solid black; } </style> </head> <body> <canvas id="clock" width="200" height="200"></canvas> <script> function drawClock() { // 获取Canvas元素 var canvas = document.getElementById("clock"); var ctx = canvas.getContext("2d"); // 获取Canvas中心点坐标 var centerX = canvas.width / 2; var centerY = canvas.height / 2; // 绘制表盘 ctx.beginPath(); ctx.arc(centerX, centerY, 80, 0, 2 * Math.PI); ctx.strokeStyle = "black"; ctx.stroke(); // 绘制刻度 for (var i = 1; i <= 12; i++) { var angle = i * Math.PI / 6; var x = centerX + 60 * Math.sin(angle); var y = centerY - 60 * Math.cos(angle); ctx.beginPath(); ctx.arc(x, y, 5, 0, 2 * Math.PI); ctx.fillStyle = "black"; ctx.fill(); } // 绘制时针 var now = new Date(); var hour = now.getHours() % 12; var minute = now.getMinutes(); var second = now.getSeconds(); var hourAngle = (hour + minute / 60) * Math.PI / 6; var hourX = centerX + 40 * Math.sin(hourAngle); var hourY = centerY - 40 * Math.cos(hourAngle); ctx.beginPath(); ctx.moveTo(centerX, centerY); ctx.lineTo(hourX, hourY); ctx.strokeStyle = "black"; ctx.stroke(); // 绘制分针 var minuteAngle = minute * Math.PI / 30; var minuteX = centerX + 60 * Math.sin(minuteAngle); var minuteY = centerY - 60 * Math.cos(minuteAngle); ctx.beginPath(); ctx.moveTo(centerX, centerY); ctx.lineTo(minuteX, minuteY); ctx.strokeStyle = "black"; ctx.stroke(); // 绘制秒针 var secondAngle = second * Math.PI / 30; var secondX = centerX + 60 * Math.sin(secondAngle); var secondY = centerY - 60 * Math.cos(secondAngle); ctx.beginPath(); ctx.moveTo(centerX, centerY); ctx.lineTo(secondX, secondY); ctx.strokeStyle = "red"; ctx.stroke(); } // 每秒钟更新时钟 setInterval(drawClock, 1000); </script> </body> </html> ``` 这段代码使用Canvas绘制了一个时钟,并且每秒钟更新一次。你可以将代码复制到一个HTML文件中运行,就可以看到时钟的效果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值