canvas绘制一个会转动的表盘

好长时间没有写过canvas了,该篇文章是我借助于两位博友的代码来实现的一篇文章,当笔记供自己日后学习更方便,也希望能帮助有需要的朋友!效果图展示效果图

<style type="text/css">
	#myCanvas,#myCanvas2{
		position: absolute;
		left: 0;
		top: 0;
		z-index: 1;
	}
	#myCanvas{
		z-index: 2;
	}
</style>
<body>
	<canvas id="myCanvas" width="500" height="500"></canvas>
		<!-- 表盘背景图画布:canvas插入画像
			[canvas插入图像不显示问题,详情参考地址:](https://www.cnblogs.com/padding1015/p/9717845.html)
		 -->
	<canvas id="myCanvas2" width="500" height="500"></canvas>
</body>
<script type="text/javascript">
	var myCanvas=document.getElementById("myCanvas");
	var cxt=myCanvas.getContext('2d');
	//表盘背景图
	var myCanvas2=document.getElementById("myCanvas2");
	var cxt2=myCanvas2.getContext('2d');
	var bgImg=new Image();
	bgImg.src="img/eg_flower.png";
	bgImg.onload = function(){
	    // console.log('图片加载成功');
	    // console.log(this);
	    cxt2.drawImage(bgImg,165,200,200,150);
	};
	function drawClock(){
	    //获取时间
	    var now = new Date();   //定义时间
	    var sec = now.getSeconds();  //获取秒
	    var minute = now.getMinutes();  //获取分钟
	    var hour = now.getHours();   //获取小时
	    //小时必须获取浮点类型,产生偏移(小时+分钟比)
	    hour = hour + minute/60;
	    //将24小时转换为12小时
	    hour=hour>12?hour-12:hour;
		//清除画布
		cxt.clearRect(0,0,500,500);
	    //表盘
	    cxt.beginPath();  //画笔开始
	    cxt.lineWidth = 2;  //设置画笔的线宽
	    cxt.strokeStyle="#999";  //设置画笔的颜色
		// 表盘外圆
	    cxt.arc(250,250,200,0,360,false);  //绘制圆形,坐标250,250 半径200,整圆(0-360度),false表示顺时针
		// cxt.moveTo(194,100);
		//表盘内圆
		cxt.moveTo(440,250);
	    cxt.arc(250,250,190,0,360,false);  //绘制圆形,坐标250,250 半径200,整圆(0-360度),false表示顺时针
	    cxt.stroke();   //填充绘图
	    cxt.closePath();  //结束画布
	    //刻度
	        //时针刻度
	        for(var i=0; i<12; i++){
				cxt.save();
				//设置时针的样式  宽度  颜色
				cxt.lineWidth=3;
				cxt.strokeStyle="#000";
				//设置异次元空间圆心
				cxt.translate(250,250);
				//设置旋转角度
				cxt.rotate(i*30*Math.PI/180);
				cxt.beginPath();
				cxt.moveTo(0,-175); //画线, 从圆心0,-175开始
				cxt.lineTo(0,-190); //到圆心0,-190结束
				cxt.stroke();
				cxt.closePath();
				cxt.restore();
	        }
	        //分针刻度
	        for(var i=0; i<60;i++){
				cxt.save();
				cxt.lineWidth=1;
				cxt.strokeStyle="#000";
				cxt.translate(250,250);
				cxt.rotate(i*6*Math.PI/180);
				cxt.beginPath();
				cxt.moveTo(0,-180);
				cxt.lineTo(0,-190);
				cxt.stroke();
				cxt.closePath();
				cxt.restore();    
	        }
	                
	    //时针
	    cxt.save();
	    //时针样式
	    cxt.lineWidth = 5;
	    cxt.strokeStyle="#000";
	    cxt.translate(250,250);
	    cxt.rotate(hour*30*Math.PI/180);
	    cxt.beginPath();
	    cxt.moveTo(0,-140);
	    cxt.lineTo(0,10);
	    cxt.stroke();
	    cxt.closePath();
	    cxt.restore();
	            
	    //分针
	    cxt.save();
	    //分针样式
	    cxt.lineWidth = 2;
	    cxt.strokeStyle="#000";
	    cxt.translate(250,250);
	    cxt.rotate(minute*6*Math.PI/180);
	    cxt.beginPath();
	    cxt.moveTo(0,-160);
	    cxt.lineTo(0,15);
	    cxt.stroke();
	    cxt.closePath();
	    cxt.restore();
	            
	    //秒针
	    cxt.save();
	    cxt.lineWidth = 3;
	    cxt.strokeStyle="#f00";
	    cxt.translate(250,250);
	    cxt.rotate(sec*60*Math.PI/1800);
	    cxt.beginPath();
	    cxt.moveTo(0,-185);
	    cxt.lineTo(0,20);
	    cxt.stroke();
	    cxt.closePath();
	            
	    //画出时针,分针,秒针交叉点
	    cxt.beginPath();
	    cxt.strokeStyle="#f00";
	    cxt.arc(0,0,5,0,360,false);
	    cxt.fillStyle="#fff";   //填充的颜色
	    cxt.fill();   //填充
	    cxt.stroke();
	    cxt.closePath();
	            
	    //秒针装饰
	    cxt.beginPath();
	    cxt.strokeStyle="#f00";
	    cxt.arc(0,-160,5,0,360,false);
	    cxt.fill();
	    cxt.stroke();
	    cxt.closePath();
	    cxt.restore();
	    function hous(x,y,r,h,cxt){
			//三次立方根
		    var gen3=Math.sqrt(3);
			//半径
		    var rs=0.5*r;
		    switch(h) {
				case 1:
					cxt.fillText("1",x+rs,y-rs*gen3);
					break;
				case 2:
					cxt.fillText("2",x+gen3*rs,y-rs);
					break;
				case 3:
					cxt.fillText("3",x+2*rs,y);
					break;
				case 4:
					cxt.fillText("4",x+gen3*rs,y+rs);
					break;
				case 5:
					cxt.fillText("5",x+rs,y+gen3*rs);
					break;
				case 6:
					cxt.fillText("6",x,y+2*rs);
					break;
				case 7:
					cxt.fillText("7",x-rs,y+gen3*rs);
					break;
				case 8:
					cxt.fillText("8",x-gen3*rs,y+rs);
					break;
				case 9:
					cxt.fillText("9",x-2*rs,y);
					break;
				case 10:
					cxt.fillText("10",x-gen3*rs,y-rs);
					break;
				case 11:
					cxt.fillText("11",x-rs,y-gen3*rs);
					break;
				case 12:
					cxt.fillText("12",x,y-2*rs);
					break;
				default:
				alert("超出时间刻度1~12的范围啦!");
			}
		}
		// 添加表盘上的数字
		cxt.font="bold 14px Arial";
		cxt.textAlign="center";
		cxt.textBaseline="midden";
		for(var i=1;i<13;i++){
			hous(252,254,160,i,cxt);
	    }
	}
   //使用setinterval()计时器让时钟动起来
   setInterval(drawClock,1000);
</script>

然后说一下清除画布,不清除画布的话,就会发生该图现象:
在这里插入图片描述
所以当时钟转动起来的时候,需要清除一下画布,不然就会像上图展示的那样,会留下时分秒三针的轨迹,遍布表盘。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值