HTML5 Canvas 第二篇

  書接上文,原諒我寫博客新手,並且還是這種總結性的文章.雖然是自己的學習筆記,但也不能這麼潦草.這篇開始,好好排版,刪掉廢話.歸納總結爲主.

  首先,回顧一下.

  頁面中加入的canvas

  <canvas id="diag" style="border:1px solid" width="200" height="200"> 
  </canvas>
  相應的繪製對角線的JS代碼

function draw(){
  var canvas = document.getElementById('diag');
  var context = canvas.getContext('2d');
  
  context.beginPath();
  context.moveTo(70,140);
  context.lineTo(140,70);
  
  context.stroke();
}
window.addEventListener("load", draw, true);

  所呈現的圖像


 OK,這次主要是用一下變換的方式來重新繪製一下.並且用路徑繪出樹,用曲線繪製出跑道. 


 2.1 變換

修正---在繪製系統中的說法就是變換.可以將變換當做介於開發人員發出的指令和canvas顯示結果之間的一個修正層.不管開發時是否需要,他都是存在的.

  在應用時可以被順序應用、組合或者隨意覆蓋.關於可重用代碼有一條重要的建議:一般繪製都應從原點(0,0)開始,應用變換(縮放、平移、旋轉等),然後不斷修改代碼直至達到希望的效果.


  代碼:用變換的方式在canvas上繪製對角線

function draw(){
  var canvas = document.getElementById('diag');
  var context = canvas.getContext('2d');
  //保存當前繪圖狀態
  context.save();
  //想右下方移動繪圖上下文
  context.translate(70,140);
  //以原點爲起點,繪製與前面相同的線段
  context.beginPath();
  context.moveTo(0,0);
  context.lineTo(70,-70);
  
  context.stroke();
}
  從第三句開始講,保存未修改的context,這樣即使進行了繪製和變換,也可以恢復到初始的狀態.

  下一步,translate函數的調用是當平移行爲發生時,我們提供的變換座標會被加到結果座標(對角線)上去,結果就是將要繪製的對角線移動到了新的位置上.不過是在繪製操作結束之後.

  應用平移後的繪製.

  繪製後的對角線和前面的一模一樣.


2.2 路徑

顧名思義就是繪製一條線條.路徑可以代表你所想在canvas上呈現的任何圖像,可以要多複雜就有多複雜,多線條、曲線段、甚至是子路徑.

  講一下那三個最常調用也是這節要繪製樹冠輪廓的函數.

  beginPath() 就是用來通知canvas將要開始繪製一個新的圖形了.canvas需要據此來計算圖形的內部和外部範圍,以便完成後續的填充和描邊.

  movaTo(x,y) 不繪製,只是將當前位置移動到新目標上(x,y)

  lineTo(x,y) 不僅將當前位置移動到新的目標(x,y),而且要在兩個座標之間畫一條直線.

  接下來,講一個特殊的路徑函數 closePath() 和lineTo很像,唯一的差別就是closePath會將路徑的起始座標作爲目標座標.還會通知canvas當前繪製的圖像已經閉合或者形成了完全封閉的區域.若想繪製子路徑,就可以在調用beginPath重新繪製新路徑並完全清除之前的所有路徑.

  代碼:繪製樹冠的輪廓

function createPath(context){
  
  context.beginPath();
  //繪製樹冠
  context.moveTo(-25,-50);
  context.lineTo(-10,-80);
  context.lineTo(-20,-80);
  context.lineTo(-5,-110);
  context.lineTo(-15,-110);
  //樹的頂點
  context.lineTo(0,-140);
  
  context.lineTo(15,-110);
  context.lineTo(5,-110);
  context.lineTo(20,-80);
  context.lineTo(10,-80);
  context.lineTo(25,-50);
  //連接起點,閉合路徑
  context.closePath();
}

  代碼:在canvas上繪製樹的輪廓

function draw(){
  var canvas = document.getElementById('diag');
  var context = canvas.getContext('2d');
  
  context.save();
  context.translate(130,250);
  //創建表現樹冠的路徑
  createPath(context);
  //繪製當前路徑
  context.stroke();
  context.restore();
}

  還是先獲取canvas的上下文對象,保存以便後使用,將當前位置變換到新位置,畫樹冠,繪製到canvas上,最後恢復上下文的初始對象.

  如圖:


  2.3 描邊樣式

  先上代碼:使用描邊樣式

  //加寬線條
  context.lineWidth = 4;
  //平滑路徑的結合點
  context.lineJoin = 'round';
  //將顏色改爲棕色
  context.strokeStyle = '#663300';
  //最後,繪製樹冠
  context.stroke();
  首先,將線條寬度加粗到4像素.其次,將lineJoin屬性設置爲round,修改當前形狀中線段的連接方式(還有 bevel、miter).最後,通過strokeStyle屬性改變線條的顏色(還可以用於生成特殊效果的圖案或漸變色).

  還有一個屬性 lineCap 屬性值爲:butt,square,round.以此來制定線條末端的樣式.

  如圖:


2.4 填充

  代碼:使用填充樣式

  //將綠色填充樹冠
  context.fillStyle = '#339900';
  context.fill();

 fill函數就可以讓canvas對當前圖形中所以的閉合路徑內部的像素點進行填充,效果如下:

 

  由於我們是先描邊後填充,所以填充會覆蓋一部分描邊路徑.填充就是把路徑輪廓內部的所以像素全部填充,所以會覆蓋描邊路徑的一半.如果希望看到完整路徑,可以在繪製路前填充.


  代碼:填充矩形區域

  //棕色爲填充色
  context.fillStyle = '#663300';
  //填充用作樹幹的矩形區域
  context.fillRect(-5,-50,10,50);

  效果如圖:

  

  這次和上次不一樣的是,我們不用lineTo畫出邊角,而是使用fillRect一步到位畫出整個樹幹.fillRect(x,y,w,h) (x,y)是點座標,w寬度,h高度. 與這個函數差不多的還有strokeRect(基於給出的位置畫出矩形的輪廓)、clearRect(清除矩形域內的所以內容並將它恢復到初始狀態,即透明色).

  2.5 繪製曲線

我們使用最簡單的曲線函數--二次函數,來繪製小路.

  代碼:繪製曲線

  //保存之前的狀態並繪製路徑
  context.save();
  
  context.translate(-10,350);
  context.beginPath();
  //第一條曲線向右上方彎曲
  context.moveTo(0,0);
  context.quadraticCurveTo(170,-50,260,-190);
  //第二條曲線向右下方彎曲
  context.quadraticCurveTo(310,-250,410,-250);
  //使用棕色的粗線來繪製路徑
  context.strokeStyle = '#663300';
  context.lineWidth = 20;
  context.stroke();
  //恢復狀態
  context.restore();

quadraticCurveTo函數繪製曲線的起點是當前座標.帶有兩組參數,第二組是指曲線的終點.第一組代表控制點(control point).所謂的控制點位於曲線的旁邊(不在曲線之上),其作用相當於對曲線產生一個拉力.通過調整控制點的位置,就可以改變曲線的曲率.

 效果如圖:


 好吧,就到這了先,洗洗睡了.

To Be Continue ... ...

發佈了13 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章