Canvas入門基礎(chǔ)(一):繪制基礎(chǔ)形狀

2018-06-19 14:26 更新
一、什么是canvas
<canvas>是一個(gè)可以使用腳本(通常為JavaScript)在其中繪制圖形的 HTML 元素。

<canvas> 元素不被一些老的瀏覽器所支持,但是所有的主流瀏覽器的近期版本都支持。
Internet Explorer 9+, Firefox, Opera, Chrome, 和 Safari 支持 <canvas> 元素. 注意: Internet Explorer 8 及更早 IE 版本的瀏覽器不支持 <canvas> 元素.

模板骨架

<canvas id="mycanvas" width="200" height="300">

您的瀏覽器不支持canvas

</canvas>


<script>

var cc=document.getElementById("mycanvas");

var cxt=cc.getContext("2d");

</script>

<canvas> 標(biāo)簽只有兩個(gè)屬性—— width和height,這兩個(gè)屬性是可選的。當(dāng)我們沒有定義時(shí),Canvas 的默認(rèn)大小為300像素×150像素(寬×高,像素的單位是px)。但是,我們也可以使用HTML的高度和寬度屬性來自定義尺寸。

你可以像給其他DOM元素一樣給canvas添加樣式;當(dāng)開始時(shí)沒有為canvas規(guī)定樣式規(guī)則,其將會(huì)完全透明。

注意:由于某些較老的瀏覽器(尤其是IE9之前的IE瀏覽器)或者文本瀏覽器不支持HTML元素"canvas",在這些瀏覽器上你應(yīng)該總是能展示替代內(nèi)容,如以上代碼中的"您的瀏覽器不支持canvas",或者你可以加一個(gè)img。 當(dāng)然,對(duì)于那些支持<canvas>的瀏覽器,它將會(huì)忽略在容器中包含的內(nèi)容,并且只是正常渲染canvas。

當(dāng)然,你也可以用代碼去檢測(cè)canvas的支持性

var canvas = document.getElementById('tutorial'); if (canvas.getContext){ var ctx = canvas.getContext('2d'); // 支持 } else { //不支持 }


二、使用 JavaScript 來繪制圖像
在真正學(xué)習(xí)繪制圖像之前,我們有必要了解一下Canvas坐標(biāo)。
Canvas坐標(biāo)
canvas是一個(gè)二維網(wǎng)格,以左上角坐標(biāo)為(0,0)

了解了canvas坐標(biāo)后,我們開始繪制圖像,可以分三步:
  1. 找到canvas元素
  2. 創(chuàng)建context對(duì)象
<canvas> 元素有一個(gè)做 getContext() 的方法,這個(gè)方法是用來獲得渲染上下文和它的繪畫功能。getContext()只有一個(gè)參數(shù),上下文的格式。這里,我們采用CanvasRenderingContext2D。
3. 繪制你所需的圖像

三、繪制矩形

HTML中的元素canvas只支持一種原生的圖形繪制:矩形。所有其他的圖形的繪制都至少需要生成一條路徑。

canvas提供了三種方法繪制矩形:
繪制一個(gè)填充的矩形

fillRect( x ,y ,width, height)

繪制一個(gè)矩形的邊框

strokeRect( x ,y ,width, height)

清除指定矩形區(qū)域,讓清除部分完全透明

clearRect( x ,y ,width, height)

參數(shù)
x與y指定了在canvas畫布上所繪制的矩形的左上角(相對(duì)于原點(diǎn))的坐標(biāo)。
width和height設(shè)置矩形的尺寸。

例子:

<script> var cc=document.getElementById("mycanvas"); if(cc.getContext){ var cxt=cc.getContext("2d"); cxt.strokeRect(20,20,100,100); cxt.fillRect(40,40,50,50); cxt.clearRect(50,50,30,30); } </script>




四、繪制路徑

圖形的基本元素是路徑。路徑是通過不同顏色和寬度的線段或曲線相連形成的不同形狀的點(diǎn)的集合。一個(gè)路徑,甚至一個(gè)子路徑,都是閉合的。使用路徑繪制圖形需要一些額外的步驟。

  1. 需要?jiǎng)?chuàng)建路徑起始點(diǎn)。
  2. 使用畫圖命令去畫出路徑。
  3. 把路徑封閉。
  4. 一旦路徑生成,就能通過描邊或填充路徑區(qū)域來渲染圖形。

以下是所要用到的函數(shù):
  • 新建一條路徑,生成之后,圖形繪制命令被指向到路徑上生成路徑。

beginPath()


  • 閉合路徑之后圖形繪制命令又重新指向到上下文中。

closePath()

這個(gè)方法會(huì)通過繪制一條從當(dāng)前點(diǎn)到開始點(diǎn)的直線來閉合圖形。如果圖形是已經(jīng)閉合了的,即當(dāng)前點(diǎn)為開始點(diǎn),該函數(shù)什么也不做。
  • 通過線條來繪制圖形輪廓。

stroke()


  • 通過填充路徑的內(nèi)容區(qū)域生成實(shí)心的圖形。

fill()


注意:當(dāng)你調(diào)用fill()函數(shù)時(shí),所有沒有閉合的形狀都會(huì)自動(dòng)閉合,所以你不需要調(diào)用closePath()函數(shù)。但是調(diào)用stroke()時(shí)不會(huì)自動(dòng)閉合。
移動(dòng)筆觸
將筆觸移動(dòng)到指定的坐標(biāo)x以及y上

moveTo(x,y)

繪制一條從當(dāng)前位置到指定x以及y位置的直線

lineTo(x,y)


例子:

cxt.beginPath(); cxt.moveTo(150,150); cxt.lineTo(150,250); cxt.lineTo(300,250); cxt.stroke(); cxt.closePath();



cxt.beginPath(); cxt.moveTo(400,400); cxt.lineTo(400,500); cxt.lineTo(500,500); cxt.fill(); cxt.closePath();



五、弧線

繪制圓弧或者圓,我們使用arc()方法


arc(x, y, radius, startAngle, endAngle, anticlockwise)

畫一個(gè)以(x,y)為圓心的以radius為半徑的圓?。▓A),從startAngle開始到endAngle結(jié)束,參數(shù)anticlockwise 為一個(gè)布爾值。為true時(shí),是逆時(shí)針方向,否則順時(shí)針方向。


注意:arc()函數(shù)中的角度單位是弧度,不是度數(shù)。角度與弧度的js表達(dá)式:radians=(Math.PI/180)*degrees。


例子:

cxt.beginPath(); cxt.arc(70,70,50,0,Math.PI/2,true); cxt.stroke(); cxt.beginPath(); cxt.arc(180,70,50,0,Math.PI/2,false); cxt.stroke(); cxt.beginPath(); cxt.arc(300,70,50,0,Math.PI/2,true); cxt.fill(); cxt.beginPath(); cxt.arc(400,70,50,0,Math.PI/2,false); cxt.fill();



六、貝塞爾(bezier)以及二次貝塞爾

路徑類型就是 貝塞爾曲線。二次以及三次貝塞爾曲線都十分有用,一般用來繪制復(fù)雜有規(guī)律的圖形。


  • 繪制二次貝塞爾曲線,x,y為結(jié)束點(diǎn),cp1x,cp1y為控制點(diǎn)。

quadraticCurveTo(cp1x, cp1y, x, y)

  • 繪制三次貝塞爾曲線,x,y為結(jié)束點(diǎn),cp1x,cp1y為控制點(diǎn)一,cp2x,cp2y為控制點(diǎn)二。

bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

七、矩形

rect(x, y, width, height)

繪制一個(gè)左上角坐標(biāo)為(x,y),寬高為width以及height的矩形。

八、Path2D 對(duì)象

正如我們?cè)谇懊胬又锌吹降?,你可以使用一系列的路徑和繪畫命令來把對(duì)象“畫”在畫布上。為了簡(jiǎn)化代碼和提高性能,Path2D對(duì)象已可以在較新版本的瀏覽器中使用,用來緩存或記錄繪畫命令,這樣你將能快速地回顧路徑。


Path2D() Path2D()會(huì)返回一個(gè)新初始化的Path2D對(duì)象(可能將某一個(gè)路徑作為變量——?jiǎng)?chuàng)建一個(gè)它的副本,或者將一個(gè)包含SVG path數(shù)據(jù)的字符串作為變量)。


new Path2D(); // 空的Path對(duì)象 new Path2D(path); // 克隆Path對(duì)象 new Path2D(d); // 從SVG建立Path對(duì)象

例子:

var path=new Path2D(); path.rect(120,120,50,50); cxt.stroke(path);


Path2D.addPath(path [, transform])? 添加了一條路徑到當(dāng)前路徑(可能添加了一個(gè)變換矩陣)


使用 SVG paths


新的Path2D API有另一個(gè)強(qiáng)大的特點(diǎn),就是使用SVG path data來初始化canvas上的路徑。這將使你獲取路徑時(shí)可以以SVG或canvas的方式來重用它們。

var p = new Path2D("M10 10 h 80 v 80 h -80 Z");

這條路徑將先移動(dòng)到點(diǎn) (M10 10) 然后再水平移動(dòng)80個(gè)單位 (h 80),然后下移80個(gè)單位 (v 80),接著左移80個(gè)單位 (h -80),再回到起點(diǎn)處 (z)。



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)