1. 程式人生 > >canvas 案例——時鐘

canvas 案例——時鐘

首先先理解幾個方法:

1、save()和restore():這對法寶非常有用,兩個配對使用,saved方法用於臨時儲存畫布的座標系統的狀態;restore方法用來恢復save之後儲存的狀態。可以簡單的理解為,save之後的一系列的操作,比如translate和rotate等,在restore後,都會被釋放恢復到原來的座標狀態。

eg:

        ctx.strokeStyle = '#000';
        ctx.strokeRect(10,10,200,100);	//空心矩形
		ctx.translate(10,10);	//改變座標原點
		ctx.strokeStyle = 'red';
		ctx.strokeRect(10,10,200,100);	//實心矩形

效果:

接下來加上save和restore

ctx.strokeStyle = '#000';
		ctx.strokeRect(10,10,200,100);	//空心矩形
		ctx.save();
		ctx.translate(10,10);	//改變座標原點
		ctx.restore();
		ctx.strokeStyle = 'red';
		ctx.strokeRect(10,10,200,100);	//實心矩形

效果:

從圖一不難發現沒加save和restore之前,紅色的矩形已經是以(10,10)為原點來繪製了,加了之後畫布恢復到translate的操作之前,原點仍然是(0,0),因此圖二的紅色矩形才會把上一個矩形給覆蓋了。

2、translate():預設畫布的原點為(0,0),呼叫此方法可改變畫布座標原點的位置。呼叫此方法後,x座標往左的位置以及y座標往上的位置都為負值。

eg:可以從上面的圖一來理解,紅色的矩形已經以(10,10)為原點來繪製了。負值的理解如下:假如把原點的位置放到畫布的正中間,那麼各區間的座標如下:

3、rotate(angle):此方法用來對畫布執行旋轉操作,預設旋轉的中心點為畫布的座標原點,可以通過translate來改變旋轉中心的位置。angle為旋轉的角度,以弧度計算,旋轉30度的話angle就是20*Math.PI/180。

eg:讓一個正方形圍繞著自己的中心點旋轉30度,

ctx.strokeRect(100,100,200,100);
		ctx.save();
		ctx.strokeStyle = 'red';
		ctx.translate(200,150);
		ctx.rotate(30*Math.PI/180);
		ctx.strokeRect(-100,-50,200,100);
		ctx.restore();

效果:

接下來說下時鐘的主要思路:就是每隔一秒把當前的時分秒對應的時針、分針、秒針繪製到畫布上就可以了,時針對應12個刻度,因此每個刻度旋轉30度,當前小時對應的旋轉角度就應該是rotate(hour*30*Math.PI/180);分針和秒針一樣對應60個刻度,每個刻度旋轉6度,當前分鐘和秒對應的旋轉角度是rotate(minute*6*Math.PI/180)以及rotate(seconds*6*Math.PI/180)。

具體程式碼如下:

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>canvas 時鐘</title>
	<style>
		*{margin: 0; padding: 0;}
		.main{
			width: 1000px;
			padding: 50px 0;
			border: 1px solid #ccc;
			margin: 0 auto;
			text-align: center;
		}
		#canvas{
			margin: 50px 0;
			background-color: deepskyblue;
		}
	</style>
</head>
<body>
<div class="main">	
	<canvas id="canvas" width="600" height="600">您的瀏覽器不支援canvas</canvas>
</div>
<script>
	window.onload = function(){
		var canvas = document.getElementById('canvas');
		var ctx = canvas.getContext('2d');
		
		function drawClock(){
			//獲取當前的時分秒
			var now = new Date();
			var seconds = now.getSeconds();
			var minute = now.getMinutes();
			var hour = now.getHours();
            //小時必須獲取浮點型別,產生偏移(小時+分鐘比)
			hour = hour+minute/60;
			//將24小時轉換為12小時
			hour = hour>12?hour-12:hour;
			
			//填寫標題
			ctx.font = '36px 微軟雅黑';			
			var grident = ctx.createLinearGradient(0,0,300,0);	//建立漸變
				grident.addColorStop(0.5,'yellow');
				grident.addColorStop(0.8,'blue');
				grident.addColorStop(1,'red');			
				ctx.fillStyle = grident;	//用漸變來填充顏色
				ctx.fillText	('canvas 時鐘',200,60);
				
				//畫圓			
				ctx.save();
				ctx.beginPath();
				ctx.lineWidth = 5;
				ctx.arc(300,300,200,0,Math.PI*360/180,false);
				ctx.strokeStyle = 'blue';
				ctx.stroke();
				ctx.closePath();
				ctx.restore();
				
				//畫時鐘的刻度	12個刻度,每個刻度旋轉30度	
				for(var i=0;i<=12;i++){
					ctx.save();
					ctx.strokeStyle = 'black';
					ctx.lineWidth = 7;
					ctx.translate(300,300);	//設定畫布的原點
					ctx.rotate(i*Math.PI*30/180,300,300);	//rotate()後兩個引數設定旋轉的中心點
					ctx.beginPath();	
					ctx.moveTo(0,-172);
					ctx.lineTo(0,-192);
					ctx.stroke();
					ctx.closePath();
					ctx.restore();
				}
				
				//畫秒鐘的刻度	60個刻度,每個刻度旋轉6度	
				for(var i=0;i<=60;i++){
					ctx.save();
					ctx.strokeStyle = 'black';
					ctx.lineWidth = 3;
					ctx.translate(300,300);	//設定畫布的原點
					ctx.rotate(i*Math.PI*6/180,300,300);	//rotate()後兩個引數設定旋轉的中心點
					ctx.beginPath();	
					ctx.moveTo(0,-182);
					ctx.lineTo(0,-192);
					ctx.stroke();
					ctx.closePath();
					ctx.restore();
				}
				
				//標註小時
				ctx.save();
				ctx.fillStyle = 'deeppink';
				ctx.font = '22px 微軟雅黑';
				ctx.lineWidth = 6;
				ctx.fillText(12,286,150);
				ctx.fillText(1,370,170);
				ctx.fillText(2,430,230);
				ctx.fillText(3,456,310);
				ctx.fillText(4,430,390);
				ctx.fillText(5,380,440);
				ctx.fillText(6,295,468);
				ctx.fillText(7,215,446);
				ctx.fillText(8,158,390);
				ctx.fillText(9,132,310);
				ctx.fillText(10,156,230);
				ctx.fillText(11,210,176);
				ctx.restore();				
				
				//畫時針
				ctx.save();
				ctx.lineWidth = 7;
				ctx.strokeStyle = 'yellow';
				ctx.translate(300,300);
				ctx.rotate(hour*30*Math.PI/180);
				ctx.beginPath();
				ctx.moveTo(0,20);
				ctx.lineTo(0,-140);
				ctx.stroke();
				ctx.closePath();
				ctx.restore();
				
				//畫分針
				ctx.save();
				ctx.lineWidth = 5;
				ctx.strokeStyle = 'blue';
				ctx.translate(300,300);
				ctx.rotate(minute*6*Math.PI/180);
				ctx.beginPath();
				ctx.moveTo(0,20);
				ctx.lineTo(0,-168);
				ctx.stroke();
				ctx.closePath();
				ctx.restore();
				
				//畫秒針
				ctx.save();
				ctx.lineWidth = 3;
				ctx.strokeStyle = 'red';
				ctx.translate(300,300);
				ctx.rotate(seconds*6*Math.PI/180);
				ctx.beginPath();
				ctx.moveTo(0,20);
				ctx.lineTo(0,-186);
				ctx.stroke();
				ctx.closePath();
				ctx.restore();
				
				//圈出時針,分針,秒針的交叉點
				ctx.save();
				ctx.beginPath();
				ctx.lineWidth = 3;
				ctx.strokeStyle = 'red';
				ctx.arc(300,300,5,0,360*Math.PI/180,false);
				ctx.fillStyle = '#fff';
				ctx.fill();
				ctx.stroke();
				ctx.closePath();
				
				//裝飾秒針
				ctx.save();
				ctx.beginPath();				
				ctx.lineWidth = 3;
				ctx.strokeStyle = 'red';
				ctx.translate(300,300);
				ctx.rotate(seconds*6*Math.PI/180);	//讓當前的裝飾跟著秒針一起轉動
				ctx.arc(0,-160,5,0,360*Math.PI/180,false);
				ctx.fillStyle = '#fff';
				ctx.fill();
				ctx.stroke();
				ctx.restore();
		}
		
		drawClock();
		setInterval(function(){
			ctx.clearRect(0,0,canvas.width,canvas.height);
			drawClock();
		},1000);
	}
</script>
</body>
</html>

效果:

相關推薦

canvas 案例——時鐘

首先先理解幾個方法: 1、save()和restore():這對法寶非常有用,兩個配對使用,saved方法用於臨時儲存畫布的座標系統的狀態;restore方法用來恢復save之後儲存的狀態。可以簡單的理解為,save之後的一系列的操作,比如translate和rotate等

canvas繪畫時鐘及倒計時時鐘

整數 效果圖 有時 二維 -c 更新時間 enter 程序 etc 因為偶是一個前端小白,所以呢!!!!想要把自己在網上看的代碼,並且自己敲了一遍,做了註釋分享給大家~~~不喜勿噴,謝謝喲!我是super喵二(程序媛),大家一起成長!!! 倒計時時鐘(先放效果圖)(好吧我

canvas繪製時鐘

css樣式 <style> body { background: black } #canvas { background: white; } </style> html <c

canvas 製作時鐘

1 <!DOCTYPE html> 2 <html> 3 <head>  4 <meta charset="utf-8"> 5   6 <title>菜鳥教程(runoob.com)<

Canvas時鐘

這個時鐘是將鐘盤的圓心點移到了 canvas 畫布中心點。以方便後面的方位計算 ctx.translate(width/2,height/2); 現定義一個圓盤來顯出這個時鐘的基本位置 ctx.save() ctx.beginPath();

Canvas時鐘

前言 不管學習什麼,不動手去做,永遠不能熟練掌握。學習了 canvas API,會覺得只要按照直線、圓等畫法去畫,canvas 太簡單了。可是,當你真正去畫的時候,會遇到許多的問題。 下面介紹的是 canvas 時鐘,主要是與大家分享我的學習過程。

通過html5 canvas繪製時鐘

最近一直在學習html5,學到了html5的canvas標籤,這個畫布真的是很強大,它有對應的javascript的api的支援,你可以在這個標籤裡面繪製任意的圖形,你也可以把圖片放在裡面,能夠做出很炫的效果。 言歸正傳,廢話不多說,首先,html,只一句

js canvas 轉動時鐘例項

原始碼:https://pan.baidu.com/s/1R12MwZYs0OJw3OWKsc8WNw 樣本:http://js.zhuamimi.cn/shizhong/ 我的百度經驗:https://jingyan.baidu.com/article/1974b28935a46bf

js+畫布canvas製作時鐘特效

<!DOCTYPE html><html><head><meta charset="UTF-8"><title></title></head><body><canvas id

h5之canvas時鐘

function clock () { var cvs = document.getElementById('cvs'); var ctx = cvs.getContext('2d'); // 清除畫布內容

微信小程式canvas動態時鐘

canvas時鐘效果圖:程式碼:wxml:<view style='width:100%;height:{{canvasHeight}}px' catchtap='goCountdown'catchlongtap='touchstart' catchtouchend='

Canvas時鐘

用canvas寫時鐘,實現效果如圖所示 1.獲取canvas和獲取繪圖環境 2.繪製錶盤 繪製一個圓心為(250,250),半徑為200的圓,0表示起始角度,2*Math.PI表示結束角度,false表示順時針開始畫 3.畫刻度 for迴圈建立刻度,以圓心為中心,先畫

[SoOnPerson] HTML5 Canvas 模擬時鐘

因為和朋友在討論一個關於時鐘的問題:    一天(24h),時鐘的分針和時針可以重合多少次,他們一直在爭論22,23然後我覺得蠻好玩的,就寫了一個看看,但是對於22,23,我也沒想數過//螢幕的高度 var sc_height = screen.availHeight; //

Canvas製作時鐘

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <style> #mycan

canvas風景時鐘

代碼 tle int utf-8 cli rest utf ont 添加 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8">

03 canvas幀動畫封裝案例

onclick width tel frame wid class () wim code sprite.js /** * Created by suxiaoxia on 2017/7/15. */ function sprite(option) { this.

android中canvas.drawText參數的介紹以及繪制一個文本居中的案例

.cn 介紹 ondraw image 圖片 oat sin es2017 tco float baseline = height/2 + mPaint.getTextSize()/2 - mPaint.getFontMetrics().descent;文字尺寸就是 pr

canvas--時鐘

utf-8 line arc reac red 2個 post false rec 可以進群領取 WEB前端學習交流群21 598399936 <!DOCTYPE html><html lang="en"><head> <

DOM案例【1】文本時鐘

ring tle 位數 date() 時間顯示 檢查 ret urn col 1.網絡參考 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <m

原生js之canvas時鐘組件

raw document tel align -a 映射 曲線 its 繪制圖形 canvas一直是前端開發中不可或缺的一種用來繪制圖形的標簽元素,比如壓縮上傳的圖片、比如刮刮卡、比如制作海報、圖表插件等,很多人在面試的過程中也會被問到有沒有接觸過canvas圖形繪制。 定