填充樣式主要針對fillStyle。fillStyle除了可以賦值為color,還可以賦值漸變色,包括線性漸變色和徑向漸變色,還是和css3裡的內容類似。
一、線性漸變
1、設定線性漸變的填充樣式
設定線性漸變的填充樣式需要2步驟
1、設定漸變線段
通過2個座標確定漸變線段,來定義漸變的方向和尺度。
var linearGradient=context.createLinearGradient(xstart,ystart,xend,yend);
2、新增關鍵色
stop來決定關鍵色的位置,從0.0到1.0的浮點數表示
color來決定關鍵色的顏色
linearGradient.addColorStop(stop,color);
然後linearGradient變數就可以作為fillStyle的值。
window.onload=function(){ var canvas=document.getElementById("canvas"); canvas.width=400; canvas.height=400; var context=canvas.getContext("2d"); //從左上角到右下角 var linearGradient=context.createLinearGradient(0,0,400,400); linearGradient.addColorStop(0.0,"#fff");//由白 linearGradient.addColorStop(1.0,'#000');//變黑 context.fillStyle=linearGradient;//然後就可以賦給fillStyle了 context.fillRect(0,0,400,400); }
2、注意點
可以新增無數個addColorStop
window.onload=function(){ var canvas=document.getElementById("canvas"); canvas.width=400; canvas.height=400; var context=canvas.getContext("2d"); //從左上角到右下角 var linearGradient=context.createLinearGradient(0,0,400,400); linearGradient.addColorStop(0.0,"red");//由紅 linearGradient.addColorStop(0.166,'orange');//變橙 linearGradient.addColorStop(0.332,'yellow');//變黃 linearGradient.addColorStop(0.498,'green');//變綠 linearGradient.addColorStop(0.664,'cyan');//變青 linearGradient.addColorStop(0.83,'blue');//變藍 linearGradient.addColorStop(1,'purple');//變紫 context.fillStyle=linearGradient;//然後就可以賦給fillStyle了 context.fillRect(0,0,400,400); }
紅橙黃綠青藍紫七個colorStop
除了傾斜漸變,還可以是水平漸變和垂直漸變。只需要修改漸變線段的起始座標。
var linearGradient=context.createLinearGradient(0,0,400,0); //水平 var linearGradient=context.createLinearGradient(0,0,0,400);//垂直
漸變線段可以不跨越整個canvas畫布,比如
var linearGradient=context.createLinearGradient(0,0,200,200);
線性漸變到(200,200)結束,結束的其它部分顯示的是結束時的顏色。
漸變線段可以超過畫布的大小, 定義在畫布外面的關鍵色將不會顯示。
var linearGradient=context.createLinearGradient(-200,-200,400,400); //超過畫布
繪製的填充的形狀也不一定佔滿整個畫布。填充形狀會在填充線段上找到合適的填充色。
var linearGradient=context.createLinearGradient(-200,-200,400,400); //超過畫布
3,將線性漸變應用到星空
//context.fillStyle="black"; //原來是黑色星空 var linearGradient=context.createLinearGradient(0,0,0,canvas.height); //垂直漸變 linearGradient.addColorStop(0.0,'black');//從黑色 linearGradient.addColorStop(1.0,'#035');//到深藍色 context.fillStyle=linearGradient;//賦值給fillStyle
再做點小修改,把畫布改成長方形,把星星分佈在上空製造出天和地的效果。
window.onload=function(){ var canvas=document.getElementById("canvas"); canvas.width=1200; //改成長方形 canvas.height=800; var context=canvas.getContext("2d"); //context.fillStyle="black"; //原來是黑色星空 var linearGradient=context.createLinearGradient(0,0,0,canvas.height); //垂直漸變 linearGradient.addColorStop(0.0,'black');//從黑色 linearGradient.addColorStop(1.0,'#035');//到深藍色 context.fillStyle=linearGradient;//賦值給fillStyle context.fillRect(0,0,canvas.width,canvas.height); for(var i=0;i<200;i++){ var r=Math.random()*5+5; //星星變小點 var x=Math.random()*canvas.width; var y=Math.random()*canvas.height*0.65; //產生天和地的效果,y座標從0到canvas高的65%的區間 var a=Math.random()*360; drawStar(context,x,y,r,a); } } //rot順時針旋轉的角度 function drawStar(ctx,x,y,R,rot){ ctx.save(); ctx.translate(x,y); ctx.rotate(rot/180*Math.PI); ctx.scale(R,R); starPath(ctx); //繪製在(x,y)大小為R,旋轉rot度的五角星 ctx.fillStyle="#fb3"; //放棄外邊框的繪製 // ctx.strokeStyle="#fd5"; // ctx.lineWidth=3; // ctx.lineJoin="round"; ctx.fill(); // ctx.stroke(); ctx.restore(); } function starPath(ctx){ ctx.beginPath(); //角度轉弧度:除以180*PI for(var i=0;i<5;i++){ ctx.lineTo(Math.cos((18+i*72)/180*Math.PI), -Math.sin((18+i*72)/180*Math.PI)); ctx.lineTo(Math.cos((54+i*72)/180*Math.PI)*0.5, -Math.sin((54+i*72)/180*Math.PI)*0.5); } ctx.closePath(); }
漸變色可以用在icon裡等,展示更立體的效果,更逼真,關鍵是確定好colorStop。
二、徑向漸變
radial Gradient定義在兩個同心圓之間的放射狀漸變。
1、設定線性漸變的填充樣式
同樣使用2步建立:
1、確定好2個圓環
var radialGradient=context.createRadialGradient(x0,y0,r0,x1,y1,r1);
2、新增colorStop
radialGradient=context.addColorStop(stop,color);
然後linearGradient變數就可以作為fillStyle的值。
把上面的彩虹線性漸變改一下:
window.onload=function(){ var canvas=document.getElementById("canvas"); canvas.width=400; canvas.height=400; var context=canvas.getContext("2d"); //從左上角到右下角 var radialGradient=context.createRadialGradient(200,200,0,200,200,200); radialGradient.addColorStop(0.0,"red");//由紅 radialGradient.addColorStop(0.166,'orange');//變橙 radialGradient.addColorStop(0.332,'yellow');//變黃 radialGradient.addColorStop(0.498,'green');//變綠 radialGradient.addColorStop(0.664,'cyan');//變青 radialGradient.addColorStop(0.83,'blue');//變藍 radialGradient.addColorStop(1,'purple');//變紫 context.fillStyle=radialGradient;//然後就可以賦給fillStyle了 context.fillRect(0,0,400,400); }
把內圓的半徑增大,
var radialGradient=context.createRadialGradient(200,200,100,200,200,200);//圓環
裡面圓填充為徑向漸變開始的顏色,外面圓外填充的是徑向漸變結束的顏色。
2,將徑向漸變應用到星空
由下邊框中心點開始的徑向漸變。
//原來是線性漸變星空 var radialGradient=context.createRadialGradient( canvas.width/2,canvas.height,0, canvas.width/2,canvas.height,canvas.height); //徑向漸變 radialGradient.addColorStop(0.0,'#035');//從深藍色 radialGradient.addColorStop(1.0,'black');//到黑色 context.fillStyle=radialGradient;//賦值給fillStyle context.fillRect(0,0,canvas.width,canvas.height);
window.onload=function(){ var canvas=document.getElementById("canvas"); canvas.width=1200; //改成長方形 canvas.height=800; var context=canvas.getContext("2d"); //原來是線性漸變星空 var radialGradient=context.createRadialGradient( canvas.width/2,canvas.height,0, canvas.width/2,canvas.height,canvas.height); //徑向漸變 radialGradient.addColorStop(0.0,'#035');//從深藍色 radialGradient.addColorStop(1.0,'black');//到黑色 context.fillStyle=radialGradient;//賦值給fillStyle context.fillRect(0,0,canvas.width,canvas.height); for(var i=0;i<200;i++){ var r=Math.random()*5+5; //星星變小點 var x=Math.random()*canvas.width; var y=Math.random()*canvas.height*0.65; //產生天和地的效果,y座標從0到canvas高的65%的區間 var a=Math.random()*360; drawStar(context,x,y,r,a); } } //rot順時針旋轉的角度 function drawStar(ctx,x,y,R,rot){ ctx.save(); ctx.translate(x,y); ctx.rotate(rot/180*Math.PI); ctx.scale(R,R); starPath(ctx); //繪製在(x,y)大小為R,旋轉rot度的五角星 ctx.fillStyle="#fb3"; //放棄外邊框的繪製 // ctx.strokeStyle="#fd5"; // ctx.lineWidth=3; // ctx.lineJoin="round"; ctx.fill(); // ctx.stroke(); ctx.restore(); } function starPath(ctx){ ctx.beginPath(); //角度轉弧度:除以180*PI for(var i=0;i<5;i++){ ctx.lineTo(Math.cos((18+i*72)/180*Math.PI), -Math.sin((18+i*72)/180*Math.PI)); ctx.lineTo(Math.cos((54+i*72)/180*Math.PI)*0.5, -Math.sin((54+i*72)/180*Math.PI)*0.5); } ctx.closePath(); }
三、使用圖片、畫布或者video
1、使用圖片建立樣式
createPattern(img,repeat-style);描述圖片以什麼樣的方式重複。
repeat-style:no-repeat / repeat-x / repeat-y / repeat
使用圖片通常為表現一種紋理或背景。
下面分別是用下圖進行填充no-repeat/repeat-x/repeat-y/repeat的效果。
window.onload=function(){ var canvas=document.getElementById("canvas"); canvas.width=400; canvas.height=400; var context=canvas.getContext("2d"); var backgroundImage=new Image(); backgroundImage.src='./images/grain.jpg'; backgroundImage.onload=function(){ var pattern=context.createPattern(backgroundImage, "no-repeat"); context.fillStyle=pattern; context.fillRect(0,0,400,400); } }
2、使用畫布建立填充樣式
createPattern(canvas,repeat-style);
讓我們可以自己繪製想要的背景圖案。
動態建立100*100的畫布,並且在上面繪製五角星。然後把該畫布作為引數傳遞給createPattern()。
window.onload=function(){ var canvas=document.getElementById("canvas"); canvas.width=400; canvas.height=400; var context=canvas.getContext("2d"); var bgCanvas=createBackgroundCanvas(); var pattern=context.createPattern(bgCanvas,"repeat"); context.fillStyle=pattern; context.fillRect(0,0,400,400); } //動態建立100*100的畫布,並且在上面繪製五角星 function createBackgroundCanvas(){ var bgCanvas=document.createElement("canvas"); bgCanvas.width=100; bgCanvas.height=100; var bgCanvasContext=bgCanvas.getContext("2d"); drawStar(bgCanvasContext,50,50,50,0); return bgCanvas; } //rot順時針旋轉的角度 function drawStar(ctx,x,y,R,rot){ ctx.save(); ctx.translate(x,y); ctx.rotate(rot/180*Math.PI); ctx.scale(R,R); starPath(ctx); //繪製在(x,y)大小為R,旋轉rot度的五角星 ctx.fillStyle="#fb3"; //放棄外邊框的繪製 // ctx.strokeStyle="#fd5"; // ctx.lineWidth=3; // ctx.lineJoin="round"; ctx.fill(); // ctx.stroke(); ctx.restore(); } function starPath(ctx){ ctx.beginPath(); //角度轉弧度:除以180*PI for(var i=0;i<5;i++){ ctx.lineTo(Math.cos((18+i*72)/180*Math.PI), -Math.sin((18+i*72)/180*Math.PI)); ctx.lineTo(Math.cos((54+i*72)/180*Math.PI)*0.5, -Math.sin((54+i*72)/180*Math.PI)*0.5); } ctx.closePath(); }
3、使用video建立填充樣式
createPattern(video,repeat-style);
四、總結
fillStyle可以賦值以下型別
fillStyle=color / gradient / image / canvas / video
其中為color時:
color= #ffffff / #642 / rgb(255,128,0) / rgba(100,100,100,0.8) / hsl(20,62%,28%) / red
為漸變時
var linearGradient=context.createLinearGradient(xstart,ystart,xend,yend);
var radialGradient=context.createRadialGradient(x0,y0,r0,x1,y1,r1);
然後addColorStop(stop,color)
為其它時,使用createPattern
createPattern(img, repeat-style)
createPattern(canvas,repeat-style)
createPattern(video,repeat-style)
其中repeat可以取值no-repeat / repeat-x / repeat-y / repeat
最後fillStyle的這些取值同樣適用於strokeStyle。
本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載註明出處:http://www.cnblogs.com/starof/p/8660470.html 有問題歡迎與我討論,共同進步。