摘要:渣渣成品圖最近對于圓形有種特別的感情呢因為寫了個就像到了用來做時鐘大概會比較有趣吧所以就著手寫了個這樣的一個東西大概代碼上錯漏還是蠻多的接下來分享下關于如何開發一個圓形時鐘條吧使用這次就沒有采用的方法來實現圓環了因為我想要做多層嵌套的圓環覺
渣渣成品圖:
http://codepen.io/thewindswor...
最近對于圓形有種特別的感情呢...因為寫了個cricle_process_bar就像到了用來做時鐘大概會比較有趣吧,所以就著手寫了個這樣的一個東西.大概代碼上錯漏還是蠻多的.接下來分享下關于如何開發一個圓形時鐘條吧~_~
使用:
Jade
canvas
這次就沒有采用div+css的方法來實現圓環了,因為我想要做多層嵌套的圓環,覺得還是使用canvas比較容易吧.然后就去了解了下canvas.
首先是HTML結構
canvas#myCircleClock(width = "300",height = "300") =
當然要是考慮到兼容的話我們可以在canvas標簽里面添加提示語句
接下來為了讓我們更直觀的看到canvas的區域我們可以為它添加樣式.
#myCircleClock{ border:1px dashed #ccc; }
好的,這樣我們就可以看到畫布邊緣很清晰的顯示出來了.
接下來就開始寫我們的主要代碼了.假如對canvas不清楚的,下面有直通車
https://developer.mozilla.org...
首先,我們需要3個圓環嵌套在一起,分別表示小時hour,分鐘minute,秒second
然后它們需要和跟著時間自動填充進度,也就是重繪.
需要時間,那自然就是var now = new Date()獲取了時間先了
now.getHours() 獲取小時 now.getMinutes() 獲取分鐘 now.getSeconds() 獲取秒數
我們先進行canvas繪畫的前提工作吧
var canvas = document.getElementById("myCircleClock"); var ctx = canvas.getContext("2d");
這樣我們就獲取到渲染上下文ctx啦.然后我們要畫圓環,這就要用到
ctx.arc(x,y,radius,startAngle,endAngle,anticlockwise)
其中anticlockwise為boolean值,如果為true,逆時針繪制,默認為false,也就是順時針.可以看出我們做順時針時鐘不需要用到這個屬性.
接下來x,y代表圓心的坐標
radius就是半徑啦.
startAngle就是圓弧起始點,單位為弧度,也就是Math.PI/360啦
endAngle也就是圓弧的終點啦
使用它之前我們先看一張圖
可以清晰看出我們需要的起始點為-Math.PI/2,終點為3*Math.PI/2.
我們需要3個圓環,要繪制很簡單,3次arc即可.
var x = 150,y = 150; var hourHand = { lineWidth: 20, x: x, y: y, circle_r: 100, color: "#aaa", begin: -Math.PI/2, end: -Math.PI/2, },/*分針*/ minuteHand = { lineWidth: 20, x: x, y: y, circle_r: 120, color: "#bbb", begin: -Math.PI/2, end: -Math.PI/2, },/*秒針*/ secondHand = { lineWidth: 20, x: x, y: y, circle_r: 140, color: "#ccc", begin: -Math.PI/2, end: -Math.PI/2, }; drawCircle(config,ctx){ ctx.strokeStyle = config.color; ctx.lineWidth = config.lineWidth; ctx.beginPath(); ctx.arc(config.x,config.y,config.circle_r,config.begin,config.end); ctx.stroke(); }
然后只要
drawCircle(secondHand,ctx); drawCircle(minuteHand,ctx); drawCircle(hourHand,ctx);
然后就可以了,我們就會看到...恩,什么都看不到先,因為config.end我們設置了-Math.PI/2
所以我們的圓弧并不會顯示出來,但是先不急,我們先理一下drawCircle里面干了啥
drawCircle(config,ctx)
我們傳入了畫畫必須要的渲染上下文ctx,圓弧配置文件config.
然后我們根據配置文件中的屬性進行了繪畫的設置.
ctx.strokeStyle 用于描述畫筆顏色或樣式的屬性,其實就是畫出來的弧是啥樣子的
https://developer.mozilla.org...
ctx.lineWidth 用于設置畫筆粗細或者說線段厚度的屬性,默認為1.0.
https://developer.mozilla.org...
!注意,設置的半徑 - lineWidth/2 = 圓心到達弧的距離
ctx.beginPath() 創建新路徑時調用該方法,等于準備好畫筆的意思,更專業的解釋如下(清除上次路徑,新建路徑)
https://developer.mozilla.org...
ctx.arc() 想好要怎么畫啦!(繪制路徑)
https://developer.mozilla.org...
ctx.stroke() 按照想好的畫出來!(根據設置樣式填充路徑)
https://developer.mozilla.org...
好的,這就是我們的drawCircle所做的事了,這樣我們就可以知道這就是所謂一幀的狀態了.
接下來我們要用肉眼見證下了!還記得被我們遺忘在墻角的Date()嗎?用到它的時候到了!
一個圓是2*Math.PI
我們把它分成60份,一份就等于Math.PI/30
分成12份的話,一份就等于Math.PI/6
然后傳入到我們的設置文件中
secondHand.end += now.getSeconds() * Math.PI/30; minuteHand.end += now.getMinutes() * Math.PI/30; hourHand.end += (now.getHours()%12) * Math.PI/6;
再進行繪制
drawCircle(secondHand,ctx); drawCircle(minuteHand,ctx); drawCircle(hourHand,ctx);
然后我們就可以看到目前我們的時間是怎么樣一個圖形啦.
接下來就是要讓它動起來了!我們就要用到requestAnimationFrame來進行動畫的繪制咯.
關于這個函數,我想張大大的文章和mdn的文檔解釋已經十分詳細啦
CSS3動畫那么強,requestAnimationFrame還有毛線用?
MDN window.requestAnimationFrame
首先我們知道它是保持著1秒60幀的速度的,那么每1/60秒,三個圓弧分別會增加
秒:2*Math.PI/(60*60)
分:秒/60
時:分/12
那就愉快的:
var s=Math.PI/1800,m = s/60,h = m/12;
在設置函數step()為一幀發生的事
/*時鐘動畫函數*/ function HandRotate(secconfig,minconfig,houreconfig,ctx){ var s = Math.PI/1800,m=s/60,h=m/12; var rotate = requestAnimationFrame(step); function step(){ secconfig.end+=s; if(secconfig.end >= 3*Math.PI/2){ secconfig.end = -Math.PI/2; } minconfig.end+=m; if(minconfig.end >= 3*Math.PI/2){ secconfig.end = -Math.PI/2; } houreconfig.end+=h; if(houreconfig.end >= 3*Math.PI/2){ houreconfig.end = -Math.PI/2; } ctx.clearRect(0,0,x*2,y*2); drawCircle(secconfig,ctx); drawCircle(minconfig,ctx); drawCircle(houreconfig,ctx); requestAnimationFrame(step); } }
每次繪制后都清除畫布來進行下一幀的繪制
ctx.clearRect(x,y,width,height)清除x,y點開始width寬,height高的矩形面積的區域圖像.
到這里我們主要的任務也算是完成啦!
后面為圓環添加顏色也好,還是添加文字也好,都是可以自由發揮啦~
不顧我的配色真的是慘不忍睹....
這次算是淺嘗輒止的一次canvas應用吧,加入有什么地方可以更改一下的,希望各位碼友能指導一下
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/50059.html
摘要:渣渣成品圖最近對于圓形有種特別的感情呢因為寫了個就像到了用來做時鐘大概會比較有趣吧所以就著手寫了個這樣的一個東西大概代碼上錯漏還是蠻多的接下來分享下關于如何開發一個圓形時鐘條吧使用這次就沒有采用的方法來實現圓環了因為我想要做多層嵌套的圓環覺 渣渣成品圖:http://codepen.io/thewindswor... 最近對于圓形有種特別的感情呢...因為寫了個cricle_proce...
摘要:渣渣成品圖最近對于圓形有種特別的感情呢因為寫了個就像到了用來做時鐘大概會比較有趣吧所以就著手寫了個這樣的一個東西大概代碼上錯漏還是蠻多的接下來分享下關于如何開發一個圓形時鐘條吧使用這次就沒有采用的方法來實現圓環了因為我想要做多層嵌套的圓環覺 渣渣成品圖:http://codepen.io/thewindswor... 最近對于圓形有種特別的感情呢...因為寫了個cricle_proce...
摘要:最近做的兩個項目都是關于的,做完整理一下,方便下一次使用,在里寫的小,功能畫扇形動態畫圓弧結合做的動畫畫表盤創建一個對象方法開始畫筆設置填充顏色是順時針是逆時針默認是逆時針結束畫筆開始填充沒有直接創建一個對象方法開始畫筆設置填充顏色是順時針 最近做的兩個項目都是關于canvas的,做完整理一下,方便下一次使用,在vue里寫的小demo,功能:畫扇形 動態畫圓弧(requestAnima...
摘要:最近做的兩個項目都是關于的,做完整理一下,方便下一次使用,在里寫的小,功能畫扇形動態畫圓弧結合做的動畫畫表盤創建一個對象方法開始畫筆設置填充顏色是順時針是逆時針默認是逆時針結束畫筆開始填充沒有直接創建一個對象方法開始畫筆設置填充顏色是順時針 最近做的兩個項目都是關于canvas的,做完整理一下,方便下一次使用,在vue里寫的小demo,功能:畫扇形 動態畫圓弧(requestAnima...
閱讀 3208·2021-09-30 09:48
閱讀 3485·2021-09-22 16:00
閱讀 1062·2019-08-30 13:08
閱讀 3098·2019-08-30 10:53
閱讀 2410·2019-08-29 18:33
閱讀 1583·2019-08-29 12:47
閱讀 896·2019-08-29 12:16
閱讀 1929·2019-08-26 12:02