html5 Canvas畫圖教程(9)—canvas中畫出矩形和圓形
發(fā)布時(shí)間:2013-01-09 14:48:56 作者:佚名
我要評(píng)論

本文講一下在canvas中畫出矩形和圓形的辦法,他們屬于基礎(chǔ)圖形。當(dāng)然,基礎(chǔ)圖形本來不止他們,但在canvas中,只有畫矩形與圓形不需要用其他方法模擬,感興趣的朋友可以了解下
本文講一下在canvas中畫出矩形和圓形的辦法,他們屬于基礎(chǔ)圖形。當(dāng)然,基礎(chǔ)圖形本來不止他們,但在canvas中,只有畫矩形與圓形不需要用其他方法模擬。
canvas畫矩形
1,fillRect與strokeRect
fillRect可以直接填充出一個(gè)矩形,填充樣式是你當(dāng)前設(shè)置的樣式;同理strokeRect就是直接描邊一個(gè)矩形
他們的參數(shù)是一致的,依次是(起點(diǎn)x坐標(biāo),起點(diǎn)y,矩形的寬,矩形的高)。這里的起點(diǎn),注意,是指矩形的左上角那個(gè)點(diǎn)。
我們通常用他們來做簡(jiǎn)單的事,他們也只能做簡(jiǎn)單的事。為什么?因?yàn)樗麄儺嫷膱D形沒有“路徑”的說法,直接就出來了。
比如你先用fillRect填充了一個(gè)矩形,然后你想把這個(gè)矩形描邊,如果你使用stroke(),則不會(huì)有效果,因?yàn)榇藭r(shí)雖然有個(gè)矩形,但并不存在路徑。
如果你迫切的想把這個(gè)矩形描邊,你可以在同樣的位置使用strokeRect()來描邊一個(gè)矩形——但他們其實(shí)是獨(dú)立的,只是位置重疊罷了。
ctx.fillRect(200,100,50,40);
ctx.strokeRect(200,100,50,40);
如果我們想要一個(gè)又有填充又有描邊的矩形,那同時(shí)使用fillRect和strokeRect無疑顯得很累贅。所以這種情況我們通常使用以下方法。
2,rect
rect的參數(shù)與fillRect和strokeRect毫無差別,不同的是他畫出的只是路徑,至于描邊或是填充要你后續(xù)自己完成。
ctx.rect(300,100,50,40);
ctx.stroke()
ctx.fill();
這樣做有什么好處呢?前面的文章我提到過,填充或描邊會(huì)消耗大量資源,所以我們經(jīng)常(比如循環(huán))需要一次性繪制幾百條路徑,再來描邊或填充。此時(shí)使用rect畫路徑,最后再填充,就避免了fillRect和strokeRec每次都要填充或描邊的問題。
3,lineTo
當(dāng)然你也可以像我的畫線條的教程那樣,用4個(gè)lineTo來畫出一個(gè)矩形。但這毫無必要,具體可查看那篇文章。
Canvas畫圓形
蒼天無眼,其實(shí)canvas并沒有一個(gè)真正的可以直接畫出圓形的函數(shù),他畫的其實(shí)是一個(gè)360度的圓弧,看起來就是個(gè)圓形了。
canvas畫圓弧的函數(shù)我們前面講過了,即arc.我們用他來畫一個(gè)圓形:
ctx.arc(300+25,100+20,20,0,Math.PI*2);
ctx.stroke()
ctx.fill();
這個(gè)arc和rect一樣,畫出的也是路徑,填充或描邊需要后續(xù)完成。
但要注意的是,圓形的位置判斷和矩形是不一樣的。我們以矩形的左上角為起點(diǎn)確定他的位置,但圓形的位置我們通常用圓心來確定。
如果你想畫一組水平和垂直都居中的矩形與圓形,那你可要記得不要把矩形的起點(diǎn)當(dāng)成了畫圓形的起點(diǎn)——圓形的起點(diǎn)可是圓心哈!
算了,我還是給你一個(gè)現(xiàn)在的公式吧,對(duì)齊的圓與矩形,圓心的坐標(biāo)=矩形的坐標(biāo)+矩形的一半寬高。
也就是圓心x=矩形x+矩形寬/2,圓形y=矩形y+矩形高/2。這樣他們就是絕對(duì)對(duì)齊了的。
雖然arc沒有直接畫圓的方法那么好用——我設(shè)想的直接畫圓的方法只需要3個(gè)參數(shù),即圓心坐標(biāo)即半徑——但arc不止可以畫圓,還可以畫半圓什么的,所以功能更強(qiáng)大,用著也將就了。
既然有圓,那么就應(yīng)該有橢圓,但canvas中連一個(gè)正規(guī)的畫圓的函數(shù)都沒有,更別提橢圓了。所以畫橢圓必須用其他方法模擬,這個(gè)比較復(fù)雜,我留到后面講吧。
canvas畫矩形
1,fillRect與strokeRect
fillRect可以直接填充出一個(gè)矩形,填充樣式是你當(dāng)前設(shè)置的樣式;同理strokeRect就是直接描邊一個(gè)矩形
他們的參數(shù)是一致的,依次是(起點(diǎn)x坐標(biāo),起點(diǎn)y,矩形的寬,矩形的高)。這里的起點(diǎn),注意,是指矩形的左上角那個(gè)點(diǎn)。
我們通常用他們來做簡(jiǎn)單的事,他們也只能做簡(jiǎn)單的事。為什么?因?yàn)樗麄儺嫷膱D形沒有“路徑”的說法,直接就出來了。
比如你先用fillRect填充了一個(gè)矩形,然后你想把這個(gè)矩形描邊,如果你使用stroke(),則不會(huì)有效果,因?yàn)榇藭r(shí)雖然有個(gè)矩形,但并不存在路徑。
如果你迫切的想把這個(gè)矩形描邊,你可以在同樣的位置使用strokeRect()來描邊一個(gè)矩形——但他們其實(shí)是獨(dú)立的,只是位置重疊罷了。
復(fù)制代碼
代碼如下:ctx.fillRect(200,100,50,40);
ctx.strokeRect(200,100,50,40);
如果我們想要一個(gè)又有填充又有描邊的矩形,那同時(shí)使用fillRect和strokeRect無疑顯得很累贅。所以這種情況我們通常使用以下方法。
2,rect
rect的參數(shù)與fillRect和strokeRect毫無差別,不同的是他畫出的只是路徑,至于描邊或是填充要你后續(xù)自己完成。
復(fù)制代碼
代碼如下:ctx.rect(300,100,50,40);
ctx.stroke()
ctx.fill();
這樣做有什么好處呢?前面的文章我提到過,填充或描邊會(huì)消耗大量資源,所以我們經(jīng)常(比如循環(huán))需要一次性繪制幾百條路徑,再來描邊或填充。此時(shí)使用rect畫路徑,最后再填充,就避免了fillRect和strokeRec每次都要填充或描邊的問題。
3,lineTo
當(dāng)然你也可以像我的畫線條的教程那樣,用4個(gè)lineTo來畫出一個(gè)矩形。但這毫無必要,具體可查看那篇文章。
Canvas畫圓形
蒼天無眼,其實(shí)canvas并沒有一個(gè)真正的可以直接畫出圓形的函數(shù),他畫的其實(shí)是一個(gè)360度的圓弧,看起來就是個(gè)圓形了。
canvas畫圓弧的函數(shù)我們前面講過了,即arc.我們用他來畫一個(gè)圓形:
復(fù)制代碼
代碼如下:ctx.arc(300+25,100+20,20,0,Math.PI*2);
ctx.stroke()
ctx.fill();
這個(gè)arc和rect一樣,畫出的也是路徑,填充或描邊需要后續(xù)完成。
但要注意的是,圓形的位置判斷和矩形是不一樣的。我們以矩形的左上角為起點(diǎn)確定他的位置,但圓形的位置我們通常用圓心來確定。
如果你想畫一組水平和垂直都居中的矩形與圓形,那你可要記得不要把矩形的起點(diǎn)當(dāng)成了畫圓形的起點(diǎn)——圓形的起點(diǎn)可是圓心哈!

算了,我還是給你一個(gè)現(xiàn)在的公式吧,對(duì)齊的圓與矩形,圓心的坐標(biāo)=矩形的坐標(biāo)+矩形的一半寬高。
也就是圓心x=矩形x+矩形寬/2,圓形y=矩形y+矩形高/2。這樣他們就是絕對(duì)對(duì)齊了的。
雖然arc沒有直接畫圓的方法那么好用——我設(shè)想的直接畫圓的方法只需要3個(gè)參數(shù),即圓心坐標(biāo)即半徑——但arc不止可以畫圓,還可以畫半圓什么的,所以功能更強(qiáng)大,用著也將就了。
既然有圓,那么就應(yīng)該有橢圓,但canvas中連一個(gè)正規(guī)的畫圓的函數(shù)都沒有,更別提橢圓了。所以畫橢圓必須用其他方法模擬,這個(gè)比較復(fù)雜,我留到后面講吧。
相關(guān)文章
- Microdata作為HTML5新增的一個(gè)特性,它允許開發(fā)者在HTML文檔中添加更多的語義信息,以便于搜索引擎和瀏覽器更好地理解頁(yè)面內(nèi)容,本文將探討HTML5中Microdata的使用方法以及2025-04-21
- 在HTML語法中,表格主要通過< table >、< tr >和< td >3個(gè)標(biāo)簽構(gòu)成,本文通過實(shí)例代碼講解HTML5表格語法格式,感興趣的朋友一起看看吧2025-04-21
- 這篇文章主要介紹了HTML5中使用媒體查詢和Flexbox進(jìn)行響應(yīng)式布局的方法,簡(jiǎn)要介紹了CSS Grid布局的基礎(chǔ)知識(shí)和如何實(shí)現(xiàn)自動(dòng)換行的網(wǎng)格布局,感興趣的朋友一起看看吧2025-04-21
基于Canvas的Html5多時(shí)區(qū)動(dòng)態(tài)時(shí)鐘實(shí)戰(zhàn)代碼
本文介紹了如何使用Canvas在HTML5上實(shí)現(xiàn)一個(gè)多時(shí)區(qū)動(dòng)態(tài)時(shí)鐘的web展示,通過Canvas的API,可以繪制出6個(gè)不同城市的時(shí)鐘,并且這些時(shí)鐘可以動(dòng)態(tài)轉(zhuǎn)動(dòng),每個(gè)時(shí)鐘上都會(huì)標(biāo)注出對(duì)應(yīng)的2025-03-11HTML5 data-*自定義數(shù)據(jù)屬性的示例代碼
HTML5的自定義數(shù)據(jù)屬性(data-*)提供了一種標(biāo)準(zhǔn)化的方法在HTML元素上存儲(chǔ)額外信息,可以通過JavaScript訪問、修改和在CSS中使用,文章還介紹了高級(jí)用法,如存儲(chǔ)JSON數(shù)據(jù)、事2025-03-11HTML5中下拉框<select>標(biāo)簽的屬性和樣式詳解
在HTML5中,下拉框(<select>標(biāo)簽)作為表單的重要組成部分,為用戶提供了一個(gè)從預(yù)定義選項(xiàng)中選擇值的方式,本文將深入探討<select>標(biāo)簽的屬性、樣式,并重點(diǎn)介2025-02-27- 本文介紹了HTML5InputDatePicker對(duì)象表示HTML``元素,是HTML5中的新對(duì)象,介紹了日期、周、月份、時(shí)間、日期+時(shí)間、本地日期時(shí)間等不同類型的日期選擇器,感興趣的朋友一起看2025-02-17
- 本文介紹了HTML5中的超鏈接、相對(duì)路徑和圖片的使用方法,超鏈接可以創(chuàng)建指向另一個(gè)文檔或頁(yè)面內(nèi)部書簽的鏈接,相對(duì)路徑用于在同一服務(wù)器內(nèi)部跳轉(zhuǎn)頁(yè)面,圖片標(biāo)簽用于引入外部圖2025-02-17
- 本文介紹了HTML5超鏈接的創(chuàng)建方法,包括基本語法、創(chuàng)建圖像超鏈接的邊框去除方法以及錨點(diǎn)鏈接的使用,還討論了超鏈接的四種不同狀態(tài)(link、visited、hover、active)的CSS樣2025-02-17
HTML5使用details標(biāo)簽:展開/收縮信息
最近看一些技術(shù)網(wǎng)站發(fā)現(xiàn)了details 標(biāo)簽的妙用,這個(gè)不用js即可實(shí)現(xiàn)展開/收縮信息,很方便用來讓用戶先才答案,然后下面點(diǎn)擊再給出答案的效果,這里就為大家簡(jiǎn)單介紹一下,2024-11-03