RELATEED CONSULTING
相關咨詢
選擇下列産品馬上(shàng)在線溝通(tōng)
服務時(shí)間(jiān):9:00-18:00
你(nǐ)可(kě)能遇到了下面的問題
關閉右側工具欄
HTML5應用之時(shí)鍾
  • 作(zuò)者:admin
  • 發表時(shí)間(jiān):2013-07-02 14:17:00
  • 來(lái)源:未知

利用HTML5的Canvas API可(kě)以完成我們以前意想不到的動畫(huà)效果,以前我們想在網頁上(shàng)放置一個(gè)時(shí)鍾,需要先用flash工具制(zhì)作(zuò)一個(gè)鍾表,并寫上(shàng)複雜的ActionScript代碼,然後載入到頁面中。而HTML5的到來(lái),我們可(kě)以直接在頁面中使用canvas标簽并配合javascript就可(kě)以完成一個(gè)漂亮的時(shí)鍾。

今天,我們一起來(lái)使用HTML5制(zhì)作(zuò)一個(gè)指針會(huì)走動的時(shí)鍾。

HTML5應用時(shí)鍾

HTML

我們隻需要在html中放置一個(gè)canvas标簽:#clock,寬度和(hé)高(gāo)度都是400px。

HTML5應用之時(shí)鍾

Javascript

我們先來(lái)獲取當前時(shí)間(jiān):包括時(shí)分秒(miǎo),确保在打開(kāi)頁面時(shí)能定位指針位置,并且定義好圓點坐(zuò)标和(hé)秒(miǎo)鍾角度變量。

var time = new Date();
var h = time.getHours(); //時(shí)
var m = time.getMinutes(); //分
var s = time.getSeconds(); //秒(miǎo)
h=h>12?(h-12)*5+parseInt(m/12):h*5+parseInt(m/12); //時(shí)針 初始位置
var x=200,y=200,sAngle=0; //x y 原點 秒(miǎo)針角度變量

接下來(lái),我們利用canvas來(lái)繪制(zhì)時(shí)鍾,我們寫一個(gè)函數(shù)draw(),繪制(zhì)刻度,執行(xíng)該函數(shù)一次,則秒(miǎo)針順時(shí)針走動1/60個(gè)圓弧度。

首先,獲取canvas繪圖對象,繪制(zhì)時(shí)鍾刻度。我們将時(shí)鍾(圓)劃分為(wèi)12個(gè)刻度,即每個(gè)刻度代表一個(gè)鍾頭,當然,你(nǐ)也可(kě)以劃分為(wèi)60個(gè)刻度,這樣每個(gè)刻度就代表1分鍾。

function draw(){
    var c=document.getElementById("clock");
    var ctx=c.getContext("2d"); //獲取繪圖對象
    ctx.clearRect(0,0,c.width,c.height); //清除上(shàng)次繪制(zhì)的圖形
    s++;//秒(miǎo)針
 
    ctx.fillStyle = '#fff' //填充白色背景色 
    ctx.fillRect(0,0,c.width,c.height);   //設置畫(huà)布區(qū)域
 
	ctx.save(); //保存當前繪圖狀态
 
    // 時(shí)間(jiān)刻度
    for(var i=0;i<12;i++){ //劃分12刻度
        var angle=(Math.PI*2)/12; //獲得(de)每個(gè)刻度對應的弧度
        ctx.beginPath();//開(kāi)始繪制(zhì)
		ctx.font="12px Arial"; //設置字體(tǐ)
        if(i==0||i==3||i==6||i==9){ //當指向0(12點)、3點、6點、9點時(shí)
             ctx.fillStyle="red"; //刻度為(wèi)紅色
             radius=4; //刻度半徑長4px
        }else{
             ctx.fillStyle="blue"; //刻度為(wèi)藍(lán)色
             radius=3; //刻度半徑長為(wèi)3px
        }
 
        ctx.arc(x,y-100,radius,0,Math.PI*2,true); //畫(huà)圓作(zuò)為(wèi)刻度
        ctx.fill(); //填充路徑
        transform(ctx,x,y,angle,true);  //刻度分布              
    }
    ctx.restore(); //恢複上(shàng)次保存的繪圖狀态
    ...
}

按照上(shàng)面的代碼可(kě)以繪制(zhì)一個(gè)帶刻度的圓盤作(zuò)為(wèi)時(shí)鍾的表盤。接下來(lái)我們繼續在函數(shù)draw()裏寫時(shí)分秒(miǎo)指針的轉動。

function draw(){
	...
    sAngle=(Math.PI*2)/60*s; //秒(miǎo)度
	//時(shí)針轉動
    ctx.save(); 
    ctx.strokeStyle="red";
    ctx.lineWidth=3;
    transform(ctx,x,y,(Math.PI*2)/60*h); 
    sj(ctx,x,y,y-40);
    ctx.restore();
 	
	//分針轉動
	ctx.save();
	ctx.strokeStyle="blue";
	ctx.lineWidth=2;
	transform(ctx,x,y,(Math.PI*2)/60*m); 
	sj(ctx,x,y,y-68);
	ctx.restore();
 
	//秒(miǎo)針轉動
	ctx.save();
	ctx.strokeStyle="#000";
	transform(ctx,x,y,sAngle);  
	sj(ctx,x,y,y-80);
	ctx.restore();
    
    //數(shù)據整理(lǐ)
    if(s%60==0){
		sAngle=0,s=0,m++;
        if(m%12==0){ //每十二分 時(shí)針旋轉一次
            if(m!=0)h++;
            if(m%60==0)m=0;
        }
     	if(h%60==0)h=0; 
    }
}

每調用一次draw(),我們對時(shí)分秒(miǎo)針設置不同的填充顔色和(hé)指針粗細,繪制(zhì)指針,根據弧度轉動指針位置,其中我們調用了自定義函數(shù)trans()和(hé)pointer()。

函數(shù)pointer()用來(lái)繪制(zhì)指針。其中ctx表示canvas對象,x,y是圓點坐(zuò)标,z是指針頭的位置。

function pointer(ctx,x,y,z){
     ctx.beginPath();
     ctx.moveTo(x,y);
     ctx.lineTo(x,z);
     ctx.stroke();
     ctx.fill();
}

函數(shù)transform()用來(lái)旋轉指針。其中ctx表示canvas對象,x,y是圓點坐(zuò)标,angle是轉動角度。

function trans(ctx,x,y,angle){
     ctx.transform(Math.cos(angle), Math.sin(angle), 
        -Math.sin(angle), Math.cos(angle), 
        x*(1-Math.cos(angle)) + x*Math.sin(angle), 
      	y*(1-Math.cos(angle)) - y*Math.sin(angle))
}

最後,我們設置每隔1秒(miǎo)鍾(即1000毫秒(miǎo))執行(xíng)一次draw()。

setInterval("draw()",1000);