1. 程式人生 > >【Canvas】(1)---概述+簡單示例

【Canvas】(1)---概述+簡單示例

Canvas---概述+簡單示例

如果通俗的去理解Canvas,我們可以去理解成它類似於我們電腦自帶的畫圖工具一樣,canvas首先是選擇一塊畫布,然後在這個畫布上描繪我們想畫的東西,畫好後展示給使用者看。

當然它不僅可以畫動態圖片,甚至可以畫出3D效果出來。

一、canvas概述

1、什麼是canvas

canvas 是HTML5提供的一種新標籤。

 <canvas></canvas>

canvas 標籤只是圖形容器,相當於一個畫布,canvas 元素本身是沒有繪圖能力的。所有的繪製工作必須在 JavaScript 內部完成,相當於使用畫筆在畫布上畫畫。

canvas 擁有多種繪製路徑、矩形、圓形、字元以及新增影象的方法。

2、canvas的特性

1.互動性:canvas支援互動,可以很好的響應使用者的操作,我們可以通過Javascript來監鍵盤,滑鼠,及其觸控裝置相關事件。

2.動 畫:任何被canvas繪製的圖形都可以新增動畫,簡單的彈跳球或者複雜的HTML5遊戲都可以實現。

3.靈活性:開發人員可以使用canvas來繪製任何的內容,比如,直線,圖形,文字,圖片等,可以包含動畫或者不包含。同時你可以新增音訊或者視訊瀏覽器支援。

4.流行度:canvas目前很流行,很多的開發人員都使用它來開發類似遊戲或者繪圖類應用。

5.web標準:只需要有瀏覽器就可以執行,而非flash或者silverlight,需要安裝相關的外掛。

3、canvas應用領域

1.視覺化資料: 各類統計圖表,比如:百度的echart

2.場景秀:用canvas實現動態的廣告效果能夠非常融洽的跨平臺執行。如:手機中微產品.在移動端相容性很好。

3.遊戲:canvas在基於Web的影象顯示方面比Flash更加立體、更加精巧,canvas成為HTML5小遊戲開發首選。

4.其他可嵌入網站的內容 (多用於活動頁面、特效):類似圖表、音訊、視訊,還有許多元素能夠更好地與Web融合,並且不需要任何外掛。

5.趨勢=> 模擬器: 無論從視覺效果還是核心功能方面來說,模擬器產品可以完全由JavaScript來實現。模擬真實硬體環境,如移動端各種型別手機.

6.趨勢=> 遠端計算機控制: Canvas可以讓開發者更好地實現基於Web的資料傳輸,構建一個完美的視覺化控制介面。

7.趨勢=> 圖形編輯器: Photoshop圖形編輯器將能夠100%基於Web實現。


二、canvas繪圖基礎

1、繪製畫布

<body>
<!--1.準備畫布  畫布預設白色的 預設長寬300*150-->
<!--1.1 設定畫布的大小  width="600" height="400" -->
<canvas width="600" height="400" ></canvas>
<!--2.準備繪製工具-->
<script>
    /*1.獲取元素*/
    var myCanvas = document.querySelector('canvas');
    /*2.獲取上下文 繪製工具箱 2d代表是2d效果 3d就是指3d效果 3d只有IE11才支援*/
    var ctx = myCanvas.getContext('2d'); 
</script>
</body>

context 是一個封裝了很多繪圖功能的物件,我們在頁面中建立一個 canvas 標籤之後,首先要使用 getContext() 獲取 canvas 的上下文環境getContext("2d") 物件是內

建的 HTML5 物件,擁有多種繪製路徑、矩形、圓形、字元以及新增影象的方法。

以上程式碼我們通過canvas取到2D的context。在HTML5 Canvas的2D結構中,座標(0,0)在左上方,這和傳統的座標不太一樣。大家需要注意一下,如下圖所示:

2、 繪製基本路徑

1)、繪製起點(moveTo)

* 語法:ctx.moveTo(x, y); 
* 解釋:設定上下文繪製路徑的起點。相當於移動畫筆到某個位置
* 引數:x,y 都是相對於 canvas盒子的最左上角。
* 注意:**繪製線段前必須先設定起點,不然繪製無效。**

2)、繪製直線(lineTo)

* 語法:ctx.lineTo(x, y);
* 解釋:從x,y的位置繪製一條直線到起點或者上一個線頭點。
* 引數:x,y 線頭點座標。

3)、路徑開始和閉合

* 開始路徑:ctx.beginPath();
* 閉合路徑:ctx.closePath();
* 解釋:如果複雜路徑繪製,必須使用路徑開始和結束。閉合路徑會自動把最後的線頭和開始的線頭連在一起。
* beginPath: 核心的作用是將 不同繪製的形狀進行隔離,
  每次執行此方法,表示重新繪製一個路徑,跟之前的繪製的墨跡可以進行分開樣式設定和管理。

4)、描邊(stroke)

* 語法:ctx.stroke();
* 解釋:根據路徑繪製線。路徑只是草稿,真正繪製線必須執行stroke

5)、總結
canvas繪製的基本步驟:

第一步:獲得上下文 =>canvasElem.getContext('2d');
第二步:開始路徑規劃 =>ctx.beginPath()
第三步:移動起始點 =>ctx.moveTo(x, y)
第四步:繪製線(矩形、圓形、圖片...) =>ctx.lineTo(x, y)
第五步:閉合路徑 =>ctx.closePath();
第六步:繪製描邊 =>ctx.stroke();

三、繪製線示例

1、畫一條線

程式碼

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        canvas{ border: 2px solid #00CED1; }
    </style>
</head>
<body>
<canvas width="300" height="200" ></canvas>
<script>
    /*1.獲取元素*/
    var myCanvas = document.querySelector('canvas');
    /*2.獲取上下文 繪製工具箱 */
    var ctx = myCanvas.getContext('2d'); 
    /*3.移動畫筆*/
    ctx.moveTo(100,100);
    /*4.繪製直線 (軌跡,繪製路徑)*/
    ctx.lineTo(200,100);
    /*5.描邊*/
    ctx.stroke();
</script>
</body>
</html>

執行效果

2、繪製平行線

程式碼

    /*上面程式碼部分省略*/
    /*第一條線*/
    ctx.moveTo(100,100);
    ctx.lineTo(200,100);
    /*第二條線*/
    ctx.moveTo(100,150);
    ctx.lineTo(200,150);
    /*描邊*/
    ctx.stroke();

執行結果

3、繪製三角形

程式碼

    /*1.繪製一個三角形*/
    ctx.moveTo(100,100);
    //第一條線
    ctx.lineTo(150,100);
    //第二條線
    ctx.lineTo(150,150);
    /*第三條線使用canvas的自動閉合 */
    ctx.closePath();
    //修改寬度
    ctx.lineWidth = 5;
    /*2.描邊*/
    ctx.stroke();

執行結果

4、繪製正方形

程式碼

   /*1.繪製兩個正方形 一大200一小100 套在一起*/
    ctx.moveTo(100,100);
    ctx.lineTo(300,100);
    ctx.lineTo(300,300);
    ctx.lineTo(100,300);
    ctx.closePath();
    
    //第二個正方形
    ctx.moveTo(150,150);
    ctx.lineTo(150,250);
    ctx.lineTo(250,250);
    ctx.lineTo(250,150);
    ctx.closePath();

    /*2.去填充*/
    //ctx.stroke();
    ctx.fillStyle = 'red';
    ctx.fill();

執行結果

重點: 在上面填充的時候回遵循非零環繞規則,這句話要理解是挺好理解的,解釋起來不大好解釋,具體可以參考這篇文章Canvas教程(21)——非零環繞原則

5、設定樣式

這裡展示一些常用的設定樣式的方法,具體就不做示例演示了。

- lineWidth 線寬,預設1px
- lineCap 線末端型別:(butt預設)、round、square 
- lineJoin 相交線的拐點 miter(預設)、round、bevel
- strokeStyle 線的顏色
- fillStyle 填充顏色
- setLineDash() 設定虛線
- getLineDash() 獲取虛線寬度集合
- lineDashOffset 設定虛線偏移量(負值向右偏移)

參考

1、 Canvas概述

2、Canvas學習筆記

3、Canvas從入門到改行



別人罵我胖,我會生氣,因為我心裡承認了我胖。別人說我矮,我就會覺得好笑,因為我心裡知道我不可能矮。這就是我們為什麼會對別人的攻擊生氣。
攻我盾者,乃我內心之矛(9)

)。