html5 Canvas畫圖教程(9)—canvas中畫出矩形和圓形
發(fā)布時(shí)間:2013-01-09 14:48:56 作者:佚名
我要評論
本文講一下在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)。
我們通常用他們來做簡單的事,他們也只能做簡單的事。為什么?因?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)在的公式吧,對齊的圓與矩形,圓心的坐標(biāo)=矩形的坐標(biāo)+矩形的一半寬高。
也就是圓心x=矩形x+矩形寬/2,圓形y=矩形y+矩形高/2。這樣他們就是絕對對齊了的。
雖然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)。
我們通常用他們來做簡單的事,他們也只能做簡單的事。為什么?因?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)在的公式吧,對齊的圓與矩形,圓心的坐標(biāo)=矩形的坐標(biāo)+矩形的一半寬高。
也就是圓心x=矩形x+矩形寬/2,圓形y=矩形y+矩形高/2。這樣他們就是絕對對齊了的。
雖然arc沒有直接畫圓的方法那么好用——我設(shè)想的直接畫圓的方法只需要3個(gè)參數(shù),即圓心坐標(biāo)即半徑——但arc不止可以畫圓,還可以畫半圓什么的,所以功能更強(qiáng)大,用著也將就了。
既然有圓,那么就應(yīng)該有橢圓,但canvas中連一個(gè)正規(guī)的畫圓的函數(shù)都沒有,更別提橢圓了。所以畫橢圓必須用其他方法模擬,這個(gè)比較復(fù)雜,我留到后面講吧。
相關(guān)文章

HTML5實(shí)現(xiàn)的移動(dòng)端購物車自動(dòng)結(jié)算功能示例代碼
本文介紹HTML5實(shí)現(xiàn)移動(dòng)端購物車自動(dòng)結(jié)算,通過WebStorage、事件監(jiān)聽、DOM操作等技術(shù),確保實(shí)時(shí)更新與數(shù)據(jù)同步,優(yōu)化性能及無障礙性,提升用戶體驗(yàn),感興趣的朋友一起看看吧2025-06-18- 在HTML5中,<button>標(biāo)簽用于定義一個(gè)可點(diǎn)擊的按鈕,它是創(chuàng)建交互式網(wǎng)頁的重要元素之一,本文將深入解析HTML5中的<button>標(biāo)簽,詳細(xì)介紹其屬性、樣式以及實(shí)際2025-06-18
基于 HTML5 Canvas 實(shí)現(xiàn)圖片旋轉(zhuǎn)與下載功能(完整代碼展示)
本文將深入剖析一段基于 HTML5 Canvas 的代碼,該代碼實(shí)現(xiàn)了圖片的旋轉(zhuǎn)(90 度和 180 度)以及旋轉(zhuǎn)后圖片的下載功能,通過對代碼的解讀,我們可以學(xué)習(xí)到如何利用 Canvas API2025-06-18
HTML5 getUserMedia API網(wǎng)頁錄音實(shí)現(xiàn)指南示例小結(jié)
本教程將指導(dǎo)你如何利用這一API,結(jié)合Web Audio API,實(shí)現(xiàn)網(wǎng)頁錄音功能,從獲取音頻流到處理和保存錄音,整個(gè)過程將逐步詳解,此外,還討論了getUserMedia API的使用限制和最2025-06-16- HTML5的搜索框是一個(gè)強(qiáng)大的工具,能夠有效提升用戶體驗(yàn),通過結(jié)合自動(dòng)補(bǔ)全功能和適當(dāng)?shù)臉邮剑梢詣?chuàng)建出既美觀又實(shí)用的搜索界面,這篇文章給大家介紹HTML5 搜索框Search Box2025-06-13
- Checkbox是HTML5中非常重要的表單元素之一,通過合理使用其屬性和樣式自定義方法,可以為用戶提供豐富多樣的交互體驗(yàn),這篇文章給大家介紹HTML5中Checkbox標(biāo)簽的深入全面解2025-06-13
HTML5無插件拖拽圖片上傳功能實(shí)現(xiàn)過程
本實(shí)例展示了一種基于HTML5技術(shù)的圖片上傳功能,無需外部插件即可通過拖放圖片實(shí)現(xiàn)上傳,涉及到HTML5的拖放API和File API,以及使用CSS來增強(qiáng)用戶界面的交互性和視覺反饋,2025-05-16- 在HTML5和CSS中,定位(positioning)是控制元素在頁面上位置的重要機(jī)制,主要有四種定位方式:靜態(tài)定位(static)、相對定位(relative)、絕對定位(absolute)和固定定位(fixed),2025-05-13
- Microdata作為HTML5新增的一個(gè)特性,它允許開發(fā)者在HTML文檔中添加更多的語義信息,以便于搜索引擎和瀏覽器更好地理解頁面內(nèi)容,本文將探討HTML5中Microdata的使用方法以及2025-04-21
在HTML語法中,表格主要通過< table >、< tr >和< td >3個(gè)標(biāo)簽構(gòu)成,本文通過實(shí)例代碼講解HTML5表格語法格式,感興趣的朋友一起看看吧2025-04-21




