Canvas在html中用來繪制各種圖形的命令了,我們Canvas命令可以輕松的制作出漂亮的圖形了,下面來看幾個HTML5中Canvas(繪制)使用例子,希望例子能夠?qū)Ω魑挥杏谩?p>Canvas中不僅可以畫線(路徑),還能畫很多其他的圖像,這一章就介紹Canvas的其他兩種繪圖API。 一、簡單圖形,整套的屬性和方法專門用于繪制矩形:
1、fillStyle可以設(shè)置為CSS顏色、一個圖案或一種顏色漸變。fillStyle默認(rèn)是純黑色,你可以設(shè)置成你喜歡的任意顏色。只要頁面打開著,每個繪圖上下文都會記錄自己的屬性,除非你重置過它。 2、fillRect(x,y,width,height)繪制一個矩形,并以當(dāng)前的fillStyle來填充。 3、srtokeStyle和fillStyle一樣,可以設(shè)置為CSS顏色、一個圖案或一種顏色漸變。 4、strokeRect(x,y,width,height)使用當(dāng)前的storke style來繪制一個矩形,strokeRect并不填充中間區(qū)域,而只繪制矩形的邊緣。 5、clearRect(x,y,width,height)清除指定矩形區(qū)域的像素。 二、路徑 按照慣例,不論開始繪制何種圖形,第一個需要調(diào)用的就是beginPath。這個簡單的函數(shù)不帶任何參數(shù),它用來通知canvas將要開始繪制一個新的圖形了。對于canvas來說,beginPath函數(shù)最大的用處是canvas需要據(jù)此來計算圖形的內(nèi)部和外部的范圍,以便完成后續(xù)的描邊和填充。 路徑會跟蹤當(dāng)前坐標(biāo),默認(rèn)值是原點。canvas本身也跟蹤當(dāng)前坐標(biāo),不過可能通過繪制代碼來修改。 每一個canvas都有一個路徑,定義路徑就如同用鉛筆作畫。你可以任意作地畫,但它不一定是最終作品的一部分,直到你拿起畫筆沾上墨水描繪這條路徑。 moveTo(x,y):不繪制,只是將當(dāng)前位置移動到新目標(biāo)坐標(biāo)(x,y),并作為線條開始點。 lineTo(x,y):繪制線條到指定的目標(biāo)坐標(biāo)(x,y),并且在兩個坐標(biāo)之間畫一條直線。不管調(diào)用它們哪一個,都不會真正畫出圖形,因為我們還沒有主,調(diào)用stroke(繪制)和fil(填充)函數(shù)。當(dāng)前,只是在定義路徑的位置,以便后面繪制時使用。 closePath(),這個函數(shù)跟lineTo很像,唯一的差別在于closePath會將路徑的起始坐標(biāo)自動作為目標(biāo)坐標(biāo)。closePath還會通知canvas當(dāng)前繪制的圖形已經(jīng)閉合或者形成了完全封閉的區(qū)域。起連接起點,閉合路徑的作用。 三、文本 操作canvas文本的方式與操作其他路徑對象的方式相同:可以描繪文本輪廓和填充文本內(nèi)部,同時,所有能夠應(yīng)用于其他圖形的變換和樣式都能用于文本。context對象的文本繪制功能由兩個函數(shù)組成: fillText(text,x,y,maxwidth) trokeText(text,x,y,maxwidth) 兩個的參數(shù)完全相同,必選參數(shù)包括文本參數(shù)以及用于指定文本位置的坐標(biāo)參數(shù)。maxwidth是可選參數(shù),用于限制字體大小,它會將文本字體強制收縮到指定尺寸。此外,還有一個measureText函數(shù)可供使用,該函數(shù)會返回一個度量對象,其包含了在當(dāng)前context環(huán)境下指定文本的實際顯示寬度。 為了保證文本在各瀏覽器下都能正常顯示,在繪制上下文里有以下字體屬性 1、font可以是CSS字體規(guī)則中的任何值。包括:字體樣式、字體變種、字體大小與粗細、行高和字體名稱。 2、textAlign控制文本的對齊方式。它類似于(但不完全相同)CSS中的text-align。可能的取值為:start,end,left,right,和center. 3、textBaseline控制文本相對于起點的位置。可以取值有top,hanging,middle,alphabetic,ideographic和bottom。對于簡單的英文字母,可以放心的使用top,middle或bottom作為文本基線。 四、顏色漸變 一旦我們擁有了繪圖上下文,就可以開始定義一個顏色漸變。漸變是兩種或更多顏色的平滑過度。canvas的繪圖上下文支持兩種類型的漸變: 1、createLinearGradient(x0,y0,x1,x1)沿著直線從(x0,y0)至(x1,y1)繪制漸變。 2、createRadialGradient(x0,y0,r0,x1,y1,r1)沿著兩個圓之間的錐面繪制漸變。前三個參數(shù)代表開始的圓,圓心為(x0,y0),半徑為r0。最后三個參數(shù)代表結(jié)束的圓,圓心為(x1,y1),半徑為r1。 五、圖片 canvas的繪圖上下文中定義了幾種繪制圖片的方法: 1、drawIamge(image,dx,dy)接受一個圖片,并將之畫到canvaa中。給出的坐標(biāo)(dx,dy)代表圖片的左上角。比如,坐標(biāo)(0,0)將把圖片畫到canvas的左上角。 2、drawIamge(image,dx,dy,dw,dh)接受一個圖片,將其縮放為寬度dw和高度dh,然后把它畫到canvas上的(dx,dy)位置。 3、drawIamge(image,sx,sy,sw,sh,dx,dy,dw,dh)接受一個圖片,通過參數(shù)(sx,sy,sw,sh)指定圖片裁剪的范圍,縮放到(dw,dh)的大小,最后把它畫到canvas上的(dx,dy)位置。 要在canvas上繪制圖像,需要一先有一個圖片。這個圖片可以是已經(jīng)存在的HTML5_Canvas_屬性、定義及方法(學(xué)習(xí)筆記)元素,或者通過JS創(chuàng)建。無論采用哪種方式,都需要在繪制canvas之前,完全加載這張圖片。瀏覽器通常會在頁面腳本執(zhí)行的同時異步加載圖片。如果試圖在圖片未完全加載之前就將其呈現(xiàn)到canvas上,那么canvas將不會顯示任何圖片。 六、漸變 漸變是指在顏色集上使用逐步抽樣算法,并將結(jié)果應(yīng)用于描邊樣式和填充樣式中。使用漸變需要三個步驟: (1)創(chuàng)建漸變對象 (2)為漸變對象設(shè)置顏色,指明過渡方式 (3)在context上為填充樣式或者描邊樣式設(shè)置漸變 要設(shè)置顯示哪種顏色,在漸變對象上使用addColorStop函數(shù)即可。這個函數(shù)允許指定兩個參數(shù):顏色和偏移量。顏色參數(shù)是指開發(fā)人員希望在偏移位置描邊或填充時所使用的顏色。偏移量是一個0.0到1.0之間的數(shù)值,代表沿著漸變線漸變的距離有多遠。 除了可以變換成其他顏色外,還可以為顏色設(shè)置alpha值(例如透明),并且alpha值也是可以變化的。為了達到這樣的效果,需要使用顏色值的另一種表示方法,例如內(nèi)置alpha組件的CSSrgba函數(shù). 除了線性漸變以外,HTML5 Canvas API還支持放射性漸變,所謂放射性漸變就是顏色會介于兩個指定圓間的錐形區(qū)域平滑變化。放射性漸變和線性漸變使用的顏色終止點是一樣的:參數(shù)如下: createRadialGradient(x0,y0,r0,x1,y1,r1) 代碼中,前三個參數(shù)代表以(x0,y0)為圓心,r0為半徑,后三個參數(shù)代表以(x1,y1)為圓心,r1為半徑的另一個圓。漸變會在兩個圓中間的區(qū)域出現(xiàn)。 七、背景圖 直接繪制圖像有很多用處,但在某些情況下,像CSS那樣使用圖片作為背景也非常有用。HTML5Canvas API還支持圖片平鋪。調(diào)用createPattern函數(shù)。 八、繪制曲線(二次曲線) quadraticCurveTo函數(shù)繪制曲線的起點是當(dāng)前坐標(biāo),帶有兩組(x,y)參數(shù),第二組是指曲線的終點。第一組代表控制點。所謂控制點位于曲線的旁邊(不是曲線之上),其作用相當(dāng)于對曲線產(chǎn)生一個拉力。通過調(diào)整控制點的位置,就可以改變曲線的曲率。 HTML5 Canvas API的其他曲線功能還涉及bezierCurveTo、arcTo和arc函數(shù)。這些函數(shù)通過多種控制點(如半徑、角度等)讓曲線更具可塑性。 九、縮放canvas對象 scale(x,y),這個函數(shù)帶有兩個參數(shù)來分別代表在x,y兩個維度的值。每個參數(shù)在canvas顯示圖像的時候,向其傳遞在本方向軸上圖像要放大(或者縮?。┑牧?。如果x值為2,就代表所繪制圖像中全部元素都會變成兩倍寬。如果y值為0.5,繪制出來的圖像全部元素都會變成之前的一半高。 注:要在原點執(zhí)行圖形和路徑的變換操作,執(zhí)行完成以后再統(tǒng)一平移。理由是綻放(scale)和旋轉(zhuǎn)(rotate)等變換操作都是針對原點進行的。如果對一個人不在原點的圖形進行旋轉(zhuǎn)變換,那么rotate變換函數(shù)會將圖形繞著原點旋轉(zhuǎn)而不是在原地旋轉(zhuǎn)。與之類似,如果進行縮放操作時沒有將放置到合適的坐標(biāo)上,那么所有路徑坐標(biāo)都會被同時縮放。取決于縮放比例的大小,新的坐標(biāo)可能會全部超出canvas范圍,進而給開發(fā)人員帶來困惑,為什么我的縮放操作會把圖像刪了? 十、變換 變換操作并不限于縮放和平移,我們可以使用函數(shù)context.rotate(angle)來旋轉(zhuǎn)圖像,甚至可以直接修改底層變換矩陣以完成一些高級操作,如剪裁圖像的繪制路徑。如:context.rotate(1.57),旋轉(zhuǎn)角度參數(shù)以弧度為單位。 beginPath():開始 moveTo(x,y):起點坐標(biāo) lineTo(x,y):目標(biāo)坐標(biāo) closePath():連接起點,閉合路徑 translate():移動 rotate():旋轉(zhuǎn) restore():恢復(fù) scale():縮放 save():保存 rotate(angle):旋轉(zhuǎn)圖像 quadraticCurveTo():繪制曲線 stroke():繪制 strokeText():描繪文本輪廓 strokeStyle():顏色設(shè)置 strokeRect():使用當(dāng)前的storke style來繪制一個矩形,而只繪制矩形的邊緣。 fill:填充 fillRect():繪制一個矩形,并以當(dāng)前的fillStyle來填充 fillStyle():樣式填充 fillText:填充文本內(nèi)容 drawIamge():圖片填充 createPattern():使用背景圖片填充 addColorStop():漸變填充 createRadialGradient():放射性漸變 clearRect():清除指定矩形區(qū)域的像素 .lineCap(butt | square | round):指定線條末端的樣式 .fillStyle:設(shè)置為CSS顏色、一個圖案或一種顏色漸變 .lineWidth:線條寬度設(shè)置 .lineJoin(round):修改當(dāng)前形狀中線段的連接方式,讓拐角變得更圓滑 .shadowColor:任何css中的顏色值,可以使用透明度(alpha) .shadowOffsetX:像素值,值為正數(shù),向右移動陰影;值為負(fù)數(shù),向左移動陰影 .shadowOffsetY:像素值,值為正數(shù),向下移動陰影;值為負(fù)數(shù),向上移動陰影 .shadowBlur:高斯模糊值,值越大,陰影越模糊 矩形
我們在上一章只用線來畫了一個矩形,其實可以一下子就畫出來的,用下面函數(shù): ctx.fillRect(x, y, width, height) 畫一個填充的矩形,x, y是矩形左上坐標(biāo),剩余兩個不是右下坐標(biāo)而是寬度和高度。 ctx.strokeRect(x, y, width, height) 類似的,不過只畫線不填充。 ctx.clearRect(x, y, width, height) 把指定的區(qū)域刪除。 我們先準(zhǔn)備三個Canvas,(html代碼如下): fillRect()
strokeRect()
clearRect()
然后是我們的繪圖參數(shù): JavaScript onload = function() { draw1(); draw2(); draw3(); }; /* fillRect() */ function draw1() { var canvas = document.getElementById('c1'); if ( ! canvas || ! canvas.getContext ) { return false; } var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.fillRect(20, 20, 80, 40); } /* strokeRect() */ function draw2() { var canvas = document.getElementById('c2'); if ( ! canvas || ! canvas.getContext ) { return false; } var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.strokeRect(20, 20, 80, 40); } /* clearRect() */ function draw3() { var canvas = document.getElementById('c3'); if ( ! canvas || ! canvas.getContext ) { return false; } var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.fillRect(20, 20, 100, 100); ctx.beginPath(); ctx.clearRect(50, 70, 60, 30); } 結(jié)果如下圖所示,就不提供實際的演示文件了,請自己輸入確認(rèn)。

上一次我們使用線繪的時候,還是用了fill和stroke方法,現(xiàn)在是不需要的。 圓(?。?/p> 先看一下參數(shù): ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise) 畫圓或者圓弧。x,y為圓心坐標(biāo),radius為半徑,startAngle,endAngle為開始/結(jié)束劃圓的角度,anticlockwise為是否逆時針畫圓(True為逆時針,F(xiàn)alse為順時針)。 注意這里的角度為弧度制,所以如果畫一個正圓的話,是0 -> Math.PI * 2,而畫60°的話,就是0 -> 60 * Math.PI / 180,最過分的是,這個和我們一般幾何里的x方向0°,y方向90°反過來了……利用上面的Canvas,再畫圓試試: JavaScript onload = function() { draw1(); draw2(); draw3(); }; /* 整個圓 */ function draw1() { var canvas = document.getElementById('c1'); if ( ! canvas || ! canvas.getContext ) { return false; } var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.arc(70, 70, 60, 0, Math.PI*2, false); ctx.stroke(); } /* 10° ~ 80°,無填充 */ function draw2() { var canvas = document.getElementById('c2'); if ( ! canvas || ! canvas.getContext ) { return false; } var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.arc(70, 70, 60, 10 * Math.PI / 180, 80 * Math.PI / 180, true); ctx.stroke(); } /* 10° ~ 80°,填充 */ function draw3() { var canvas = document.getElementById('c3'); if ( ! canvas || ! canvas.getContext ) { return false; } var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.arc(70, 70, 60, 10 * Math.PI / 180, 80 * Math.PI / 180, true); ctx.fill(); } 結(jié)果如下圖的上三個情況,也請自己輸入加深印象。

下圖為startAngle=1.1PI,endAngle=1.9PI,anticlockwise為false的情況下的繪制情況,注意從x軸方向開始,往下走角度開始。
HTML5中的Canvas(顏色) 指定顏色 現(xiàn)在為止我們畫的圖形都是黑色的,這是Canvas繪制的默認(rèn)色彩,要想換一種顏色的話,就得在實際畫之前指定顏色。 ctx.strokeStyle = color —— 指定繪制線的顏色 ctx.fillStyle = color —— 指定填充的顏色 來看看實際的例子: JavaScript onload = function() { draw(); }; function draw() { var canvas = document.getElementById('c1'); if ( ! canvas || ! canvas.getContext ) { return false; } var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.fillStyle = 'rgb(192, 80, 77)'; // 紅 ctx.arc(70, 45, 35, 0, Math.PI*2, false); ctx.fill(); ctx.beginPath(); ctx.fillStyle = 'rgb(155, 187, 89)'; // 綠 ctx.arc(45, 95, 35, 0, Math.PI*2, false); ctx.fill(); ctx.beginPath(); ctx.fillStyle = 'rgb(128, 100, 162)'; // 紫 ctx.arc(95, 95, 35, 0, Math.PI*2, false); ctx.fill(); } 效果如下圖: 
指定透明度 和普通的CSS中一樣,我們指定顏色的時候還可以帶一個alpha值(不過用的不多,IE9之前都不支持)??创a: onload = function() { draw(); }; function draw() { var canvas = document.getElementById('c1'); if ( ! canvas || ! canvas.getContext ) { return false; } var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.fillStyle = 'rgba(192, 80, 77, 0.7)'; // ctx.arc(70, 45, 35, 0, Math.PI*2, false); ctx.fill(); ctx.beginPath(); ctx.fillStyle = 'rgba(155, 187, 89, 0.7)'; // ctx.arc(45, 95, 35, 0, Math.PI*2, false); ctx.fill(); ctx.beginPath(); ctx.fillStyle = 'rgba(128, 100, 162, 0.7)'; // ctx.arc(95, 95, 35, 0, Math.PI*2, false); ctx.fill(); }
結(jié)果就是下面這樣: 
和上面的代碼基本沒變化,就是把rgb(r, g, b)變成了rgba(r, g, b, a)而已,a的值也是0~1,0表示完全透明,1則是完全不透明(所以alpha的值實際上是“不透明度”)。
全局透明度 上面我們給每一個圓加了0.7的alpha值,不過我們每個圓的alpha都是一樣的,每個都寫一遍未免有些麻煩(說是我沒覺得麻煩……只不過不這么說就沒法引出這個新功能?。海?/p> ctx.globalAlpha = alpha 這個參數(shù)指定了全局的alpha值,這么設(shè)定之后,所有畫的圖案都會有這么點的透明,除非你又特別指定了。所以把我們的第一個例子稍微改一下: onload = function() { draw(); }; function draw() { var canvas = document.getElementById('c1'); if ( ! canvas || ! canvas.getContext ) { return false; } var ctx = canvas.getContext('2d'); ctx.globalAlpha = 0.7; // 就多了這么一句 ctx.beginPath(); ctx.fillStyle = 'rgb(192, 80, 77)'; ctx.arc(70, 45, 35, 0, Math.PI*2, false); ctx.fill(); ctx.beginPath(); ctx.fillStyle = 'rgb(155, 187, 89)'; ctx.arc(45, 95, 35, 0, Math.PI*2, false); ctx.fill(); ctx.beginPath(); ctx.fillStyle = 'rgb(128, 100, 162)'; ctx.arc(95, 95, 35, 0, Math.PI*2, false); ctx.fill(); } 然后我們的結(jié)果就和2完全一樣了: 
畫圖多的時候,還是能少打很多字的。
|