摘要:最近在學(xué),然后根據(jù)上的例子做了個(gè)動(dòng)畫(huà)時(shí)鐘為什么要造個(gè)輪子,因?yàn)槌?。。首先,找一張時(shí)鐘的圖片,就是下面這張了。那么我們就用循環(huán)來(lái)畫(huà)出小時(shí)的刻度。這個(gè)就是我們的繪制時(shí)鐘的函數(shù)。到這里,動(dòng)畫(huà)時(shí)鐘就了效果圖如下演示地址地址
最近在學(xué)canvas,然后根據(jù)MDN上的例子做了個(gè)動(dòng)畫(huà)時(shí)鐘(為什么要造個(gè)輪子,因?yàn)槌?。。?/del>
這是MDN上的例子,怎么說(shuō)呢,比較復(fù)古吧。
首先,找一張時(shí)鐘的圖片,就是下面這張了。
——來(lái)自bigger than bigger的dribbble網(wǎng)站,圖片來(lái)源(侵刪)
然后就開(kāi)始用canvas實(shí)現(xiàn)這個(gè)逼格滿(mǎn)滿(mǎn)的時(shí)鐘吧。在html代碼中插入canvas標(biāo)簽
在js文件中創(chuàng)建畫(huà)布(假設(shè)我們使用的都是現(xiàn)代瀏覽器)。
function clock() { var ctx = document.getElementById("canvas").getContext("2d"); }
先來(lái)繪制時(shí)鐘表盤(pán),我們看到這張圖是帶有光線(xiàn)陰影效果的,畫(huà)成一樣難度太高。于是就用顏色的漸變來(lái)讓時(shí)鐘看起來(lái)稍微立體一點(diǎn)。在canvas中用createLinearGradient來(lái)創(chuàng)建一個(gè)新的漸變,并用addColorStop上色,最后把顏色賦給strokeStyle。詳見(jiàn)運(yùn)用樣式與顏色 by MDN
//繪制表盤(pán)底色 ctx.translate(200, 200); //將坐標(biāo)原點(diǎn)移到畫(huà)布中心 ctx.rotate(-Math.PI/2); //將坐標(biāo)軸逆時(shí)針旋轉(zhuǎn)90度,x軸正方向?qū)?zhǔn)12點(diǎn)方向 var lingrad = ctx.createLinearGradient(150, 0, -150, 0); lingrad.addColorStop(0, "#242f37"); lingrad.addColorStop(1, "#48585c"); ctx.fillStyle = lingrad; ctx.beginPath(); ctx.arc(0, 0, 150, 0, Math.PI * 2, true); ctx.fill();
比較關(guān)鍵的一點(diǎn)是畫(huà)布的坐標(biāo)軸x軸正方向是時(shí)鐘3點(diǎn)鐘方向,為了方便起見(jiàn),我們把它逆時(shí)針旋轉(zhuǎn)90度讓它指向十二點(diǎn)鐘方向。
繪制刻度要用到旋轉(zhuǎn)rotate(變形 Transformations by MDN),小時(shí)刻度有12個(gè),相鄰兩個(gè)刻度與圓心連線(xiàn)的角度就是Math.PI/6,這里用的是弧度表示,也就是30度。那么我們就用for循環(huán)來(lái)畫(huà)出小時(shí)的刻度。
for (var i = 0; i < 12; i++) { ctx.beginPath(); ctx.strokeStyle = "#fff"; ctx.lineWidth = 3; ctx.rotate(Math.PI / 6); ctx.moveTo(140, 0); ctx.lineTo(120, 0); ctx.stroke(); }
同理,分鐘的刻度也一樣。
ctx.beginPath(); for (i = 0; i < 60; i++) { if (i % 5 !== 0) { //去掉與小時(shí)刻度重疊的部分 ctx.beginPath(); ctx.strokeStyle = "#536b7a"; ctx.lineWidth = 2; ctx.moveTo(140, 0); ctx.lineTo(130, 0); ctx.stroke(); } ctx.rotate(Math.PI / 30); }
表盤(pán)大致畫(huà)好了,刻度也畫(huà)好了,接下來(lái)就是繪制指針并讓它指向正確的時(shí)間,是不是?不就就是畫(huà)一條直線(xiàn)么。關(guān)鍵是指針rotate的角度是多少呢?其實(shí)也是比較簡(jiǎn)單的。先獲取當(dāng)前的時(shí)間,把小時(shí)轉(zhuǎn)換為12小時(shí)制的。
var now = new Date(), sec = now.getSeconds(), min = now.getMinutes(), hr = now.getHours(); hr = hr > 12 ? hr - 12 : hr;
那么,時(shí)針的位置就是(相對(duì)于x軸正方向轉(zhuǎn)過(guò)的角度):
ctx.rotate(hr * (Math.PI / 6) + min * (Math.PI / 360) + sec * (Math.PI / 21600));
同理,分針和秒針的位置:
ctx.rotate(min * (Math.PI / 30) + sec * (Math.PI/1800)); //分針 ctx.rotate(sec * (Math.PI /30)); //秒針
最后,最關(guān)鍵的讓指針轉(zhuǎn)動(dòng)起來(lái),這里要用到的是requestAnimationFrame方法,用來(lái)重繪頁(yè)面,得到連貫逐幀的動(dòng)畫(huà),實(shí)現(xiàn)最佳的動(dòng)畫(huà)效果。
window.requestAnimationFrame(callback);
這個(gè)callback就是我們的繪制時(shí)鐘的clock()函數(shù)。需要注意的是每次執(zhí)行完requestAnimationFrame后需要清除畫(huà)布,不然出現(xiàn)重疊交錯(cuò)的現(xiàn)象,我們把它放在clock函數(shù)開(kāi)始的地方。
ctx.clearRect(0, 0, canvas.width, canvas.height);
到這里,動(dòng)畫(huà)時(shí)鐘就OK了 效果圖如下:
Codepen演示地址
Github地址
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88020.html
摘要:渣渣成品圖最近對(duì)于圓形有種特別的感情呢因?yàn)閷?xiě)了個(gè)就像到了用來(lái)做時(shí)鐘大概會(huì)比較有趣吧所以就著手寫(xiě)了個(gè)這樣的一個(gè)東西大概代碼上錯(cuò)漏還是蠻多的接下來(lái)分享下關(guān)于如何開(kāi)發(fā)一個(gè)圓形時(shí)鐘條吧使用這次就沒(méi)有采用的方法來(lái)實(shí)現(xiàn)圓環(huán)了因?yàn)槲蚁胍龆鄬忧短椎膱A環(huán)覺(jué) 渣渣成品圖:http://codepen.io/thewindswor... 最近對(duì)于圓形有種特別的感情呢...因?yàn)閷?xiě)了個(gè)cricle_proce...
摘要:渣渣成品圖最近對(duì)于圓形有種特別的感情呢因?yàn)閷?xiě)了個(gè)就像到了用來(lái)做時(shí)鐘大概會(huì)比較有趣吧所以就著手寫(xiě)了個(gè)這樣的一個(gè)東西大概代碼上錯(cuò)漏還是蠻多的接下來(lái)分享下關(guān)于如何開(kāi)發(fā)一個(gè)圓形時(shí)鐘條吧使用這次就沒(méi)有采用的方法來(lái)實(shí)現(xiàn)圓環(huán)了因?yàn)槲蚁胍龆鄬忧短椎膱A環(huán)覺(jué) 渣渣成品圖:http://codepen.io/thewindswor... 最近對(duì)于圓形有種特別的感情呢...因?yàn)閷?xiě)了個(gè)cricle_proce...
摘要:渣渣成品圖最近對(duì)于圓形有種特別的感情呢因?yàn)閷?xiě)了個(gè)就像到了用來(lái)做時(shí)鐘大概會(huì)比較有趣吧所以就著手寫(xiě)了個(gè)這樣的一個(gè)東西大概代碼上錯(cuò)漏還是蠻多的接下來(lái)分享下關(guān)于如何開(kāi)發(fā)一個(gè)圓形時(shí)鐘條吧使用這次就沒(méi)有采用的方法來(lái)實(shí)現(xiàn)圓環(huán)了因?yàn)槲蚁胍龆鄬忧短椎膱A環(huán)覺(jué) 渣渣成品圖:http://codepen.io/thewindswor... 最近對(duì)于圓形有種特別的感情呢...因?yàn)閷?xiě)了個(gè)cricle_proce...
摘要:有了,我們就再也不需要了,直接使用完成繪制。繪制原點(diǎn)開(kāi)始時(shí)鐘開(kāi)始時(shí)鐘我們將當(dāng)前時(shí)間繪制到始終上面即可需要注意的是,在繪制之前需要將之前繪制的東西清除掉。Canvas是HTML5新增的組件,它就像一塊幕布,可以用JavaScript在上面繪制各種圖表、動(dòng)畫(huà)等。 沒(méi)有Canvas的年代,繪圖只能借助Flash插件實(shí)現(xiàn),頁(yè)面不得不用JavaScript和Flash進(jìn)行交互。有了Canvas,我們就...
閱讀 1811·2023-04-26 00:47
閱讀 1560·2021-11-11 16:55
閱讀 2640·2021-09-27 14:04
閱讀 3567·2021-09-22 15:58
閱讀 3566·2021-07-26 23:38
閱讀 2146·2019-08-30 13:47
閱讀 1994·2019-08-30 13:15
閱讀 1161·2019-08-29 17:09