基於canvas的簡易時鐘實踐

最近閒下來,開始了HTML5的入門之旅。跟着某視頻(避免廣告嫌疑)做了兩個簡單的canvas例子。此處爲簡易時鐘實例。

PS: 例子爲實驗性例子,歡迎批判~~~~

 

一、實現邏輯

     1、先畫出錶盤:最外端的圓、時刻度、分秒刻度

     2、使用canvas的畫布旋轉,分別畫出時針、分針、秒針(含秒針外端圓點)

     3、定時清空畫布,並重新繪製時針。

 

二、代碼展示

      1、效果圖

 

 

      2、以下爲代碼:

 

<!DOCTYPE HTML>
<html>
 <head>
	<meta charset="gb2312">
  <title> Canvas-時鐘 </title>
 </head>
 <body>
  <canvas width="500" height="500" id="clock" >您的瀏覽器不支持<code>canvas</code>標籤!</canvas>
  <script>
	//獲取畫布DOM
	var dCanvas = document.getElementById('clock');
	//設置繪圖環境.注意只能用小寫“2d”
	var paper = dCanvas.getContext('2d');
	var CX=250,CY=250;
	
	//畫表盆(藍色)
	clockHandler();
	window.setInterval(clockHandler,1000);
	function drawClockBg(_paper){
		_paper.lineWidth=10;
		_paper.strokeStyle="blue";
		_paper.beginPath();
		_paper.arc(CX,CY,200,0,360,false);//最後一個參數,表示是否順時針畫
		_paper.stroke();
		_paper.closePath();
	};

	/**
	*	畫時針刻度
	*
	**/
	function drawClockHour(_paper){
		for(var i=0;i<12;i++){
			_paper.save();
			_paper.strokeStyle="black";
			_paper.translate(CX,CY);
			_paper.rotate(i*30*Math.PI/180);
			_paper.beginPath();
			_paper.moveTo(0,-175);
			_paper.lineTo(0,-195);
			_paper.stroke();
			_paper.closePath();
			_paper.restore();
		}
	};

	/**
	*	畫秒/分刻度
	*
	**/
	function drawClockSecond(_paper){
		for(var i=0;i<60;i++){
			if(i%5===0)continue;
			_paper.save();
			_paper.lineWidth=4;
			_paper.strokeStyle="black";
			_paper.translate(CX,CY);
			_paper.rotate(i*6*Math.PI/180);
			_paper.beginPath();
			_paper.moveTo(0,-185);
			_paper.lineTo(0,-195);
			_paper.stroke();
			_paper.closePath();
			_paper.restore();
		}
	};

	/**
	*	畫時針
	**/
	function drawClockHourLine(_paper,_hour){
			_paper.save();
			_paper.lineWidth=10;
			_paper.strokeStyle="black";
			_paper.translate(CX,CY);
			_paper.rotate(_hour*30*Math.PI/180);
			_paper.beginPath();
			_paper.moveTo(0,-85);
			_paper.lineTo(0,5);
			_paper.stroke();
			_paper.closePath();
			_paper.restore();
	};

	/**
	*	畫分針
	**/
	function drawClockMinuteLine(_paper,_minute){
			_paper.save();
			_paper.lineWidth=6;
			_paper.strokeStyle="black";
			_paper.translate(CX,CY);
			_paper.rotate(_minute*6*Math.PI/180);
			_paper.beginPath();
			_paper.moveTo(0,-125);
			_paper.lineTo(0,10);
			_paper.stroke();
			_paper.closePath();
			_paper.restore();
	};
	
	/**
	*	畫秒針
	**/
	function drawClockSecondLine(_paper,_second){
			_paper.save();
			_paper.lineWidth=3;
			_paper.strokeStyle="red";
			_paper.translate(CX,CY);
			_paper.rotate(_second*6*Math.PI/180);
			//秒針線
			_paper.beginPath();
			_paper.moveTo(0,-185);
			_paper.lineTo(0,15);
			_paper.stroke();
			_paper.closePath();
			//初始化秒針圓點
			drawBaseCircle(_paper,0,-160,"yellow");
			_paper.restore();
	};

	/**
	*	畫圓點 錶盤圓點、秒針外端圓點
	**/
	function drawBaseCircle(_paper, _x, _y , fs){
			if(typeof fs == 'undefined')  fs = "gray";
			_paper.beginPath();
			_paper.fillStyle=fs;
			_paper.arc(_x,_y,5,0,360,false);
			_paper.fill();
			_paper.closePath();
	}

	/**
	*	定時處理時鐘指針
	**/
	function clockHandler(){
		//清空已畫的內容
		paper.clearRect(0,0,500,500);

		//畫表盆(藍色)
		drawClockBg(paper);
		//畫時刻度
		drawClockHour(paper);
		//畫秒刻度
		drawClockSecond(paper);
		//初始化時間
		var nowDate = new Date();
		//獲取當前時間的小時數
		var hour = (nowDate.getHours()%12) + parseFloat(nowDate.getMinutes()/60,2);
		//獲取當前時間的分鐘數
		var minute = nowDate.getMinutes() + parseFloat(nowDate.getSeconds()/60,2);
		//獲取當前時間的秒數
		var second = nowDate.getSeconds();

		//初始化時針
		drawClockHourLine(paper,hour);
		//初始化分針
		drawClockMinuteLine(paper,minute);
		//初始化秒針
		drawClockSecondLine(paper,second);
		//初始化中心圓點
		drawBaseCircle(paper,CX,CY);
	};

  </script>
 </body>
</html>

    

 三、後記

      1、代碼在FireFox 32.0.3上,測試無誤!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章