HTML5 Canvas基本概念講解
html5,這應該就不需要多作介紹了,只要是開發人員應該都不會陌生。 html5是「新興」的網頁技術標準,目前,除IE8及其以下版本的IE瀏覽器之外,幾乎所有主流瀏覽器(FireFox、Chrome、Opera、Safari、IE9 )都已經開始支援html5了。除此之外,在行動瀏覽器市場上,眾多的行動瀏覽器也紛紛展開關於「html5的支援能力以及效能表現」的軍備競賽。 html作為革命性的網頁技術標準,加上許多瀏覽器廠商或組織的鼎力支持,可以想見,html5將會成為未來網頁技術的領頭羊。
html5,說其是「新興」的,其實也不算新了。畢竟,html5早在2008年第一份正式草案就已經對外公佈。從2008年算起,到現在也算是有些年頭了。不過,到目前為止,對於大多數開發人員而言,仍然是「雷聲大,雨點小」——聽說html5的多,實際使用html5的卻很少。
眾所周知,html5中增加了許多新特性。在html5的眾多特性中,Canvas應該算是最引人注目的新功能之一。我們使用html5的Canvas物件可以直接在瀏覽器的網頁上繪製圖形。這表示瀏覽器可以脫離Flash等第三方插件,直接在網頁上顯示圖形或動畫。
現在,我們就來為html5初學者介紹如何使用html5 Canvas繪製基本的圖形。
首先,我們要準備以下html基礎程式碼:
現在,我們就在包含上述程式碼的html檔案中進行Canvas繪製圖形的實例講解。首先,我們在上述html程式碼的body部分加入如下canvas標籤。
此時,我們使用支援html5的瀏覽器開啟該頁面,將會看到以下內容:
在html5中,canvas標籤本身並沒有任何行為,只是在頁面上佔用指定大小的頁面空白空間。 canvas標籤就相當於一塊空白的畫布,也需要我們自己使用JavaScript提供的canvas API編寫對應的程式碼從而在這塊畫布上繪製出我們想要的圖形。
備註:canvas標籤體內的文字內容將會以不支援html5的瀏覽器顯示。如上述html程式碼所示,如果你的瀏覽器不支援html5的canvas標籤,那麼將會在canvas標籤處顯示文字「您的瀏覽器不支援canvas標籤」。
身為「畫家」的我們,首先需要熟悉手中的畫筆,也就是JavaScript中的Canvas物件及其相關內容。
在html5中,一個canvas標籤對應一個Canvas對象,我們在JavaScript可以使用document.getElementById()等常規函數來取得該物件。值得注意的是,在JavaScript中,我們並不是直接操作Canvas對象,而是透過Canvas物件來取得對應的圖形繪製上下文物件CanvasRenderingContext2D,然後我們再利用CanvasRenderingContext2D物件自帶的許多繪製圖形的函數來繪圖。
這就好像是每一張畫布都對應一支畫筆,要想在畫布上繪畫,我們就先要拿到對應的畫筆,然後使用這支畫筆在畫布上繪圖。 CanvasRenderingContext2D物件就相當於這支畫筆。現在,我們就先來嘗試在JavaScript中拿到這支畫筆。
如上述程式碼所示,我們可以使用Canvas物件的getContext()方法來取得CanvasRenderingContext2D物件。比較細心的讀者應該注意到了:getContext()方法需要傳入一個字串-2d,取得到的CanvasRenderingContext2D物件的名稱中也帶有2D。這是因為,目前html5只支援2D繪圖,但在未來的html5中也可能支援3D或其他形式的繪圖。屆時,我們可能就需要使用getContext("3d")來取得CanvasRenderingContext3D物件並繪製3D圖形了。
使用html5 canvas繪製線條(直線、折線等)
使用html5 Canvas繪製直線所需的CanvasRenderingContext2D物件的主要屬性和方法(有"()"者為方法)如下:
属性或方法 | 基本描述 |
---|---|
strokeStyle | 用于设置画笔绘制路径的颜色、渐变和模式。该属性的值可以是一个表示css颜色值的字符串。如果你的绘制需求比较复杂,该属性的值还可以是一个CanvasGradient对象或者CanvasPattern对象 |
globalAlpha | 定义绘制内容的透明度,取值在0.0(完全透明)和1.0(完全不透明)之间,默认值为1.0。 |
lineWidth | 定义绘制线条的宽度。默认值是1.0,并且这个属性必须大于0.0。较宽的线条在路径上居中,每边各有线条宽的一半。 |
lineCap | 指定线条两端的线帽如何绘制。合法的值是 "butt"、"round"和"square"。默认值是"butt"。 |
beginPath() | 开始一个新的绘制路径。每次绘制新的路径之前记得调用该方法。它将重置内存中现有的路径。 |
moveTo(int x, int y) | 移动画笔到指定的坐标点(x,y) ,该点就是新的子路径的起始点 |
lineTo(int x, int y) | 使用直线连接当前端点和指定的坐标点(x,y)
|
stroke(int x, int y) | 沿着绘制路径的坐标点顺序绘制直线 |
closePath() | 如果当前的绘制路径是打开的,则关闭掉该绘制路径。此外,调用该方法时,它会尝试用直线连接当前端点与起始端点来关闭路径,但如果图形已经关闭(比如先调用了stroke())或者只有一个点,它会什么都不做。 |
使用canvas繪製基本的直線
現在,我們就使用canvas來繪製最基本的直線。
顯示效果如下:
使用canvas繪製有顏色的直線
大家都知道,在現實世界中,畫筆也是多種多樣的,並且具有各種不同的顏色。同樣的,Canvas的畫筆CanvasRenderingContext2D物件也同樣可以有你所需要的各種顏色。在上面的程式碼範例中,我們沒有指定顏色的話,Canvas的畫筆就預設為最常見的黑色。
現在我們再次使用Canvas的畫筆繪製一條藍色的直線(基於頁面簡潔考慮,下面只給出關鍵的JavaScript程式碼,請同時參考上面完整的程式碼範例)。
使用canvas繪製基本的折線
當我們掌握了Canvas繪製直線之後,繪製折線等其他形式的線條就簡單多了。我們只需要多繪製幾個路徑中間點,並依序將它們連接起來即可。
JavaScript Code対応する表示効果は次のとおりです:
上記の内容をマスターすると、Canvas を使用して線を描くための基本的な理解が深まったと思います。線幅や透明度などの制御には 1 つの属性を設定するだけでよいため、上記の関連する API を参照してください。ここでは詳細は説明しません。
重要な注意: グラフィックス パスを描画するときは、必ず最初に beginPath() を呼び出してください。 beginPath() メソッドは、メモリ内の以前の描画パス情報をクリアします。これを行わないと、単一の図形を描画する場合には影響がありませんが、複数の図形 (上の例では 2 本の直線など) を描画する場合、パスの描画などの操作で予期しない結果が生じる可能性があります。または色の塗りつぶし。
さらに、初心者は closePath() メソッド、特に上記の API 表の closePath() メソッドの説明の赤字部分に少し注意する必要があります。ポリラインを描画する上記のコード例では、最初に stroke() を呼び出し、次に closePath() を呼び出しました。実際、ストローク() メソッドが呼び出されたとき、ポリラインはすでに描画されており、現在の描画パスは閉じられているため、closePath() メソッドが再度呼び出されたとき、現在の描画パスを接続するために直線は使用されません。エンドポイントと開始エンドポイント (つまり、ここでの closePath() はオプションですが、良い習慣を維持するために、これを記述することをお勧めします)。 stopPath() と closePath() の呼び出し順序を入れ替えると、状況はまったく異なります。最初に closePath() が呼び出され、この時点では描画パスは閉じられていないため、closePath() は現在の終点と開始終点を直線で結びます。
ストローク()とclosePath()の呼び出し順序を入れ替えたサンプルコードは以下の通りです。
呼び出し順序を交換した後の、対応する表示効果は次のとおりです: