亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > HTML5 > 正文

HTML5 Canvas 起步(2) - 路徑

2024-09-05 07:19:41
字體:
來源:轉載
供稿:網友
這篇將要介紹一下 Canvas 中的基本圖形。

圖形的基礎 - 路徑

在 Canvas 中,所有基本圖形都是以路徑為基礎的,也就是說,我們在調用 2dContext 的 lineTo、rect 等方法時,其實就是往已經的 context 路徑集合中再添加一些路徑點,在最后使用 fill 或 stroke 方法進行繪制時,都是依據這些路徑點來進行填充或畫線。

在每次開始繪制路徑前,都應該使用 context.beginPath() 方法來告訴 Context 對象開始繪制一個新的路徑,否則接下來繪制的路徑會與之前繪制的路徑疊加,在填充或畫邊框時就會出現問題。在繪制完成路徑后,可以直接使用 context.closePath() 方法來關閉路徑,或者手動關閉路徑。另外,如果在填充時路徑沒有關閉,那么 Context 會自動調用 closePath 方法將路徑關閉。

基本路徑方法

1. beginPath, closePath

這兩個方法在前面已經介紹過,分別用來通知 Context 開始一個新的路徑和關閉當前的路徑。

在 Canvas 中使用路徑時,應該要保持一個良好的習慣,每次開始繪制路徑前都要調用一次 beginPath 方法,否則畫出來的效果難看不說,還會嚴重影響性能。

在下面這張圖中,左邊的圖形在每次繪制矩形前都調用了一次 beginPath 來清除之前的路徑并重新開始繪制新的路徑,而后面的圖形則就只在繪制所有圖形前調用了一次 beginPath 來清除路徑,因此,雖然這里是使用的邊框色是 #666,但是右邊的圖形顏色比左邊的深一些,因為每次使用 stroke 繪制邊框時,會把之前的路徑再次繪制一遍,疊加起來顏色就比原來深一些。

圖片附件


提示:您可以先修改部分代碼再運行

在 Context 中路徑數較少時,如果不考慮顯示效果,性能上還可以接受,但是如果 Context 中的路徑數很多時,在開始繪制新路徑前不使用 beginPath 的話,因為每次繪制都要將之前的路徑重新繪制一遍,這時性能會以指數下降。

因此,除非有特殊需要,每次開始繪制路徑前都要調用 beginPath 來開始新路徑。

2. 移動與直線 moveTo, lineTo, rect

圖片附件


提示:您可以先修改部分代碼再運行

void moveTo(in float x, in float y);

在 Canvas 中繪制路徑,一般是不需要指定起點的,默認的起點就是上一次繪制路徑的終點,因此,如果需要指定起點的話,就需要使用 moveTo 方法來指定要移動到的位置。

void lineTo(in float x, in float y);

lineTo 方法則是繪制一條直接路徑到指定的位置。在調用完 lineTo 方法后,Context 內部的繪制起點會移動到直線的終點。

void rect(in float x, in float y, in float w, in float h);

rect 方法用來繪制一個矩形路徑,通過參數指定左上角位置以及寬和高。在調用 rect 后,Context 的繪制起點會移動到 rect 繪制的矩形的左上角。

rect 方法與后面要介紹的 arc 方法與其他路徑方法有一點不同,它們是使用參數指定起點的,而不是使用 Context 內部維護的起點。

3. 曲線 arcTo, arc, quadraticCurveTo, bezierCurveTo

void arcTo(in float x1, in float y1, in float x2, in float y2, in float radius);

按照 WHATWG 文檔的說明,這個方法是畫一個與兩條射線相切的的圓弧,兩條射線其中一條為穿過 Context 繪制起點,終點為 (x1, y1),另外一條為穿過 (x2, y2),終點為 (x1, y1),這條圓弧為最小的與這兩條射線相切的圓弧。在調用完 arcTo 方法后,將 圓弧與 射線 (x1, y1)-(x2, y2) 的切點添加到當前路徑中,做為下次繪制的起點。

在測試中發現,Firefox 和 Opera 目前對這個方法的支持并不好,只有 Chrome 和 Safari 4 能繪制出正確的路徑。

圖片附件

圖中的的兩條灰色直線是偏移 4 個像素后的兩條射線所在的位置。


提示:您可以先修改部分代碼再運行

void arc(in float x, in float y, in float radius, in float startAngle, in float endAngle, in boolean anticlockwise);

arc 方法用來繪制一段圓弧路徑,通過圓心位置、起始弧度、終止弧度來指定圓弧的位置和大小,這個方法也依賴于 Context 維護的繪制起點。而在畫圓弧時的旋轉方向則由最后一個參數 anticlockwise 來指定,如果為 true 就是逆時針,false 則為順時針。

void quadraticCurveTo(in float cpx, in float cpy, in float x, in float y);

quadraticCurveTo 方法用來繪制二次樣條曲線路徑,參數中 cpx 與 cpy 指定控制點的位置,x 和 y 指定終點的位置,起點則是由 Context 維護的繪制起點。

void bezierCurveTo(in float cp1x, in float cp1y, in float cp2x, in float cp2y, in float x, in float y);

bezierCurveTo 方法用來繪制貝塞爾曲線路徑,它與 quadraticCurveTo 相似,不過貝塞爾曲線有兩個控制點,因此參數中的 cp1x, cp1y, cp2x, cp2y 用來指定兩個控制點的位置,而 x 和 y 指定綹的位置。

圖片附件


提示:您可以先修改部分代碼再運行

4. fill, stroke, clip

fill 與 stroke 這兩個方法很好理解,分別用來填充路徑與繪制路徑線條。

clip 方法用來給 Canvas 設置一個剪輯區域,在調用 clip 方法之后的代碼只對這個設定的剪輯區域有效,不會影響其他地方,這個方法在要進行局部更新時很有用。默認情況下,剪輯區域是一個左上角在 (0, 0),寬和高分別等于 Canvas 元素的寬和高的矩形。

圖片附件

在畫這個圖時,雖然兩次都是使用 fillRect(0, 0, 100, 100) 填充了一個 100x100 大小矩形,但是顯示的結果卻是第二次填充的只是中間的一小塊,這是因為在兩次填充之間使用 clip 方法設定了剪輯區域,這樣第二次填充時只會影響到所設定的中間那一小部分區域。


提示:您可以先修改部分代碼再運行

5. clearRect, fillRect, strokeRect

這三個方法并不是路徑方法,而是用來直接處理 Canvas 上的內容,相當于 Canvas 的背景,調用這三個方法也不會影響 Context 繪圖的起點。

要清除 Canvas 上的所有內容時,可以直接調用 context.clearRect(0, 0, width, height) 來直接清除,而不需要使用路徑方法繪制一個與 Canvas 同等大小的矩形路徑再使用 fill 方法去清除。

結語

通過 Canvas 的路徑方法,可以使用 Canvas 處理一些簡單的矢量圖形,這樣在縮放時也不會失真。不過 Canvas 的路徑方法也不是很強大,至少連個橢圓的路徑都沒有……

這篇寫得有點長了,Cnavas 中路徑相關的內容就寫這么多,后面再講講 Canvas 其他的東西。

參考資料

1. The Canvas Element, WHATWG

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美视频在线观看 亚洲欧| 91日本视频在线| 伊人久久综合97精品| 久久成人人人人精品欧| 亚洲精品av在线| 日韩在线观看免费全集电视剧网站| 久久精品国产成人精品| 欧美另类极品videosbestfree| 色樱桃影院亚洲精品影院| 国产成人精品一区二区三区| 亚洲国产精品嫩草影院久久| 97精品一区二区视频在线观看| 久久精品视频在线播放| 国产成人中文字幕| 中文字幕在线看视频国产欧美在线看完整| 中文字幕av一区二区三区谷原希美| 久久伊人精品视频| 国产精品美乳一区二区免费| 日本精品一区二区三区在线播放视频| 国产精品一区二区性色av| 日韩**中文字幕毛片| 亚洲精品按摩视频| 国产日韩欧美视频在线| 久久综合久久88| 最近中文字幕mv在线一区二区三区四区| 日韩av在线直播| 在线中文字幕日韩| 国产日韩精品在线观看| 色婷婷亚洲mv天堂mv在影片| 日韩中文在线视频| 久久久久久久一区二区| 国产视频精品在线| 国产精品老女人视频| 日韩精品视频免费| 国产成人高清激情视频在线观看| 亚洲国产精品va在线| 色系列之999| 久久久久久久一区二区三区| 欧美裸体xxxx极品少妇| 97在线免费视频| 91精品啪aⅴ在线观看国产| 欧美黄色片视频| 久久天天躁夜夜躁狠狠躁2022| 国产一区红桃视频| 影音先锋欧美精品| 国产精品美女久久久久久免费| 亚洲最新av网址| 国产在线不卡精品| 成人免费观看a| 亚洲男人第一av网站| 美日韩精品免费观看视频| 91av在线播放视频| 国产精品国产三级国产aⅴ9色| 亚洲奶大毛多的老太婆| 亚洲va久久久噜噜噜久久天堂| 欧美在线中文字幕| 日韩欧美一区二区在线| 国产在线视频2019最新视频| 一本一本久久a久久精品综合小说| 成人网页在线免费观看| 欧美精品一区二区免费| 久久精品99久久香蕉国产色戒| 日本一本a高清免费不卡| 欧美激情在线一区| 在线播放日韩专区| 欧美精品videos性欧美| 国产精品一区二区三区免费视频| 国产成人欧美在线观看| 欧美中文字幕视频在线观看| 欧美大学生性色视频| 国产91对白在线播放| 日韩中文字幕视频在线观看| 国产亚洲精品91在线| 国产精品视频白浆免费视频| 日韩精品视频观看| 亚洲在线视频观看| 国产精品视频公开费视频| 亚洲精品视频播放| 91精品国产高清久久久久久| 91地址最新发布| 久久久999精品免费| 欧美电影电视剧在线观看| 69**夜色精品国产69乱| 亚洲人成77777在线观看网| 成人国产精品一区| 国产一区欧美二区三区| 日韩黄色在线免费观看| 久久久久久国产精品| 国模私拍一区二区三区| 国产一区欧美二区三区| 国产网站欧美日韩免费精品在线观看| 91九色综合久久| 久久综合免费视频影院| 日韩a**站在线观看| 国产精品免费久久久久影院| 97色在线播放视频| 亚洲国产欧美一区二区三区久久| 国产成人综合精品| 亚洲级视频在线观看免费1级| 蜜月aⅴ免费一区二区三区| 久久精品久久精品亚洲人| 九九热最新视频//这里只有精品| 欧美老女人www| 亚洲91精品在线观看| 久久综合色88| 91国产精品视频在线| 欧美大尺度激情区在线播放| 疯狂做受xxxx高潮欧美日本| 大桥未久av一区二区三区| 国产成人免费av电影| 国产日韩在线看| 欧美精品免费在线观看| 欧美性猛交xxxx乱大交| 国产精品久久久久久久午夜| 热久久这里只有精品| 久热精品视频在线观看| 国产欧美一区二区三区久久人妖| 久久伊人色综合| 精品国产91乱高清在线观看| 亚洲成人aaa| 中文字幕日本精品| 日韩电影中文字幕在线| 日韩电影免费在线观看中文字幕| 国内外成人免费激情在线视频网站| 欧美日韩国产精品一区二区不卡中文| 精品性高朝久久久久久久| 69国产精品成人在线播放| 国产精品吹潮在线观看| 国产v综合v亚洲欧美久久| 美女国内精品自产拍在线播放| 亚洲最大福利视频网| 久久精品电影网| 高清日韩电视剧大全免费播放在线观看| 欧美视频精品一区| 成人国产亚洲精品a区天堂华泰| 国产精品吹潮在线观看| 午夜精品美女自拍福到在线| 国产成人精品久久| 国产精品日韩在线观看| 97精品久久久| 中文欧美在线视频| 成人免费午夜电影| 另类少妇人与禽zozz0性伦| 欧美午夜片在线免费观看| 日韩毛片在线观看| 久久久久久久爱| 国模私拍一区二区三区| 欧美高清视频免费观看| 久久影视电视剧免费网站清宫辞电视| 国产精品一二区| 91精品国产成人www| 欧美男插女视频| 亚洲人成电影网站色| 91高清视频在线免费观看| 欧美黑人xxxx| 美女视频黄免费的亚洲男人天堂| 97视频在线观看播放| 国产不卡av在线免费观看| 亚洲成人精品在线| 在线日韩av观看| 欧美最猛黑人xxxx黑人猛叫黄| 欧美日韩第一视频| 亚洲国产又黄又爽女人高潮的| 国产精品爽爽爽|