基於HTML5的移動Web應用——HTML5 畫布

在HTML5之前,網頁顯示圖像是用jpg、png 等嵌入式圖像格式。動畫通常是由Flash 實現的。圖像顯示會拖慢頁面加載速度,Flash 依賴於第三方也會出現一些用戶無法解決的問題。現在出現了兩種新的圖形格式canvas和svg,並且HTML5對它們提供了非常好的支持,其中, canvas 爲HTML5的新增元素,本節將對canvas的用法進行詳細介紹。

1、初識 canvas

canvas的中文意思爲畫布,現實生活中的畫布是用來作畫的,HTML5中的canvas與之類似,可以稱其爲“網頁中的畫布”,有了這個畫布便可以輕鬆地在網頁中繪製圖形、表格、文字、圖片等。

(1)創建畫布

HTML5中提供了<canvas>標籤,使用<canvas>標籤可以在網頁中創建一個矩形區域的畫布,它本身不具有繪製功能,可以通過JavaScript操作繪製圖形的API進行繪製操作。
在網頁中創建一個畫布的語法如下所示:

<canvas id="cavsElem" width="400" height="300">您的瀏覽器不支持canvas</canvas>

在上面語法中,定義id屬性是爲了在JavaScript代碼中引用元素。標籤中間的文字在瀏覽器不支持canvas的情況下才會顯示。<canvas>標籤與<img>標籤一樣,有兩個原生屬性width和height,默認300x 150像素,沒有單位的值將會被忽略不計。另外,不要用CSS控制它的寬和高,否則可能會引起畫布上的圖形變形。

要在畫布中繪製圖形,首先要通過JavaScript的getElementById()函數獲取到網頁中的畫布對象,代碼如下:

var canvas=document.getElementById('cavsElem');

canvas 畫布默認爲透明,背景色可以自定義。

(2)準備畫筆

有了畫布之後,要開始作畫需要準備一隻畫筆,這隻畫筆就是context對象。context對象是畫布的上下文,也叫作繪製環境,是所有的繪製操作API的入口。該對象可以使用JavaScript腳本獲得,具體語法如下:

var context=canvas.getContext('2d');

在上面語法中參數2d代表畫筆的種類,這裏用來執行二維操作,三維操作也是存在的,可以把參數替換爲webgl,三維操作目前還沒有廣泛應用,瞭解即可。

(3)座標和起始點

2d代表一個平面,繪製圖形時需要在平面上確定起始點,也就是“從哪裏開始畫”,這個點需要通過座標來控制,canvas的座標系從最左上角“0, 0”開始。x軸向右增大,y軸向下增大,如圖所示。
在這裏插入圖片描述
圖 canvas 的座標系說明圖
設置上下文繪製路徑起點的代碼如下:

var context=canvas. getContext ('2d');
context .moveTo(x,y);

在上述語法中,x、y都是相對於canvas畫布的最左上角。使用context對象的moveTo()方法進行設置,相當於移動畫筆到某個位置。

(4)繪製線條

在canvas中使用lineTo()方法繪製直線,代碼如下:

context.lineTo(x,y);

在上面語法中,“x,y”爲線頭點座標,lineTo()方法用於定義從“x,y”的位置繪製一條直線到起點或者上一個線頭點。

(5)路徑

路徑是所有圖形繪製的基礎,例如繪製直線確定了起始點和線頭點後,便形成了一條繪製路徑。如果繪製複雜路徑,必須使用開始路徑和閉合路徑的方法,代碼如下:

context.beginPath();   //開始路徑
context.closePath();   //閉合路徑

開始路徑的核心作用是將不同線條繪製的形狀進行隔離,每次執行此方法,表示重新繪製一個路徑,同之前繪製的路徑可以分開樣式設置和管理;閉合路徑會自動把最後的線頭和開始的線頭連在一起。

(6)描邊

在canvas圖形繪製中,路徑只是草稿,真正繪製線必須執行stroke()方法根據路徑進行描邊,代碼如下:

context.stroke();

有了以上內容作爲基礎,就可以利用Canvas繪製一個圖形,基本步驟如下:
(1)創建畫布: <canvas></canvas>.
(2)準備畫筆(獲取上下文對象): canvas.getContex(2d);
(3)開始路徑規劃: context.beginPath();
(4)移動起始點: context.moveTo(x, y);
(5)繪製線(矩形、圓形、圖片…): context.lineTo(x, y);
(6)閉合路徑: context.closePath();
(7)繪製描邊: context.stroke();

下面通過一個案例來演示如何在頁面中繪製一個三角形,如示例所示。
【示例】 Canvas繪製三角形

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>Canvas繪製三角形</title>
</head>
<body>
<canvas id="cavsElem">
    你的瀏覽器不支持canvas,請升級瀏覽器
</canvas>
<script>
    //===============基本繪製API====================
    //獲得畫布
    var canvas = document.getElementById('cavsElem');
    var context = canvas.getContext('2d');  //獲得上下文
    //設置標籤的屬性寬高和邊框
    canvas.width = 900;
    canvas.height = 600;
    canvas.style.border="1px solid #000";
    //繪製三角形
    context.beginPath();        //開始路徑
    context.moveTo(100,100);    //三角形,左頂點
    context.lineTo(300, 100);   //右頂點
    context.lineTo(300, 500);   //底部的點
    context.closePath();        //結束路徑
    context.stroke();           //描邊路徑
</script>
</body>
</html>

用瀏覽器打開頁面效果如圖所示。
在這裏插入圖片描述
圖 示例頁面效果
在示例中,使用JavaScript爲畫布設置了寬高和邊框,然後通過座標確定了三角形的3個點,規劃了繪製路徑,最後進行描邊操作,成功地繪製了一個三角形。

(7)填充

在示例中,繪製了一個只有邊框的空三角形,canvas 中提供了用於填充當前圖形(閉合路徑)的方法:

context.fill();

在示例4中進行描邊操作之後添加上述填充方法,頁面效果如圖所示。
在這裏插入圖片描述
圖 三角形填充後效果

2、利用canvas繪製矩形和清除矩形

在前面介紹了利用canvas繪製圖形的基本步驟,getContext(“2d”)對象作爲HTML5的內建對象,它還提供了快速繪製矩形、圓形、字符,以及添加圖像的方法。例如,分別使用strokeRect()方法和fillRect()方法來繪製矩形邊框和填充矩形,代碼如下:

context.strokeRect (x, y, width, height);   //繪製矩形邊框
context.fillRect (x,y, width, height);         //繪製填充矩形

在上面語法中,x、y代表矩形起點的橫縱座標,width 和height代表要繪製矩形的寬和高,需要注意的是兩個方法可以單獨使用,如示例所示。
【示例】 繪製矩形

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>繪製矩形</title>
</head>
<body>
<canvas id="cavsElem">
    你的瀏覽器不支持canvas,請升級瀏覽器
</canvas>
<script>
    //===============繪製矩形====================
    //獲得畫布
    var canvas = document.getElementById('cavsElem');
    var context = canvas.getContext('2d');  //獲得上下文
    //設置標籤的屬性寬高和邊框
    canvas.width = 900;
    canvas.height = 600;
    canvas.style.border="1px solid #000";
    //繪製矩形
    context.strokeRect(200,50,200,100);
    context.fillRect(200,200,200,100);
</script>
</body>
</html>

用瀏覽器打開示例,頁面效果如圖所示。
在這裏插入圖片描述
圖 示例頁面效果

在示例中,通過座標的不同,繪製了兩個不同位置的矩形邊框和填充矩形。在canvas中還有一個相當於橡皮擦的方法,使用它可以清除矩形內繪製的內容,語法如下:

context.clearRect (x, y, width, height)

在上面語法中,x.y代表要清除矩形起點的橫縱座標,width 和height代表要清除矩形的寬和高,具體用法如示例所示。

【示例】 清除矩形

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>清除矩形</title>
</head>
<body>
<canvas id="cavsElem">
    你的瀏覽器不支持canvas,請升級瀏覽器
</canvas>
<script>
    //===============清除矩形====================
    //獲得畫布
    var canvas = document.getElementById('cavsElem');
    var context = canvas.getContext('2d');  //獲得上下文
    //設置標籤的屬性寬高和邊框
    canvas.width = 900;
    canvas.height = 600;
    canvas.style.border="1px solid #000";
    //繪製矩形
    context.strokeRect(200,50,200,100);
    context.fillRect(200,200,200,100);
    //清除矩形
    context.clearRect(100,100,200,150);
</script>
</body>
</html>

用瀏覽器打開頁面效果如圖所示。
在這裏插入圖片描述
圖 示例頁面效果

在圖中,兩個矩形中缺少的部分爲被清除的矩形區域,畫布上的任意圖形都可以用這樣的方式來清除。

3、利用 canvas繪製圓形

在canvas中可以使用arc()方法來繪製弧形和圓形,具體語法如下:

context.arc (x , y, radius, startAngle, endAngle, bAntiClockwise);

上述語法中,x、y代表arc的中心點;radius 代表圓形半徑的長度; startAngle 代表以starAngle開始(弧度),endAngle 代表以endAngle結束(弧度); bAntiClockwise 代表是否是逆時針,設置爲true意味着弧形的繪製是逆時針方向的,false則爲順時針進行。

下面通過一個案例來演示如何使用arc()方法繪製圓形和弧形,如示例所示。
【示例】 繪製圓形和弧形

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>繪製圓形和弧形</title>
</head>
<body>
<canvas id="cavsElem" width='400' height="300">
    你的瀏覽器不支持canvas,請升級瀏覽器
</canvas>
<script>
    /* 繪製圓形*/
    //獲得畫布並上下文對象
    var context = document.getElementById('cavsElem').getContext('2d');
    context.beginPath();//開始路徑
    context.arc(100,100,100,0,2*Math.PI,true);//繪製圓形,true逆時針
    context.closePath();//關閉路徑
    context.fillStyle = 'pink';//設置填充顏色
    context.fill();//填充
    /* 繪製弧形*/
    context.beginPath();//開始路徑
    context.strokeStyle = "#fff";//設置描邊顏色
    context.lineWidth = 5;//設置線的粗細
    context.arc(100,100,25,Math.PI/6,5*Math.PI/6,false);//繪製弧形,
    context.stroke();//描邊
</script>
</body>
</html>

用瀏覽器打開示例,頁面效果如圖所示。
在這裏插入圖片描述
圖 示例頁面效果

在示例中,fillStyle()方法用於設置圖形的填充顏色,strokeStyle()方法用於設置描邊的顏色,lineWidth屬性用於設置線條的粗細(以像素爲單位)。這些樣式設置同樣可以應用於其他任意圖形。arc()方法的參數中,bAntiClockwise 設置爲false,代表要繪製一個弧形,使用Math.PI來獲取圓周率π的值,並且使用它來計算弧度值。特殊角度數和弧度數對應如表所示。

表 角度數和弧度數對比

30° 45° 60° 90° 120° 135° 150° 180° 270° 360°
弧度 0 π/6 π/4 π/3 π/2 2π/3 3π/4 5π/6 π 3π/2

4、利用 canvas繪製圖片

canvas中的繪製圖片其實就是把一幅圖放在畫布 上,語法如下:

context.drawImage (image, dx, dy)                                   //繪製原圖
context. drawImage (image, dx, dy, dWidth, dHeight)            //縮放繪圖
context.drawImage (image, sx, sy, sWidth, sHeigh, dx, dy, dWidth, dHeight) // 切片繪圖

在上述語法中,image 代表圖片的來源,dx、 dy 代表在目標中的座標,sx、sy是Image在源中的起始座標,sWidh. sHeight 是源中圖片的寬和高,dWidth. dHeight 是目標的寬和高。

Drawlmag()方法的常用方式是繪製原圖,如示例所示。

【示例】 繪製圖片

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>繪製圖片</title>
</head>
<body>
<canvas id="cavsElem" width="400" height="300" >
    你的瀏覽器不支持canvas,請升級瀏覽器
</canvas>
<script type="text/javascript">
    //獲得畫布
    var canvas=document.getElementById('cavsElem');
    //設置畫布邊框
    canvas.style.border="1px solid #000";
    //獲取上下文
    var context = canvas.getContext('2d');
    //創建圖片對象
    var img=new Image();
    //設置圖片路徑
    img.src="img/img1.jpg";
    //當頁面加載完成使用此圖片
    img.onload = function(){
        //使用canvas繪製圖片
        context.drawImage(img,0,0);
    };
</script>
</body>
</html>

用瀏覽器打開示例,頁面效果如圖所示。
在這裏插入圖片描述
圖 示例頁面效果

在示例中,必須使用圖片對象的onload事件,否則是看不到運行效果的,因爲繪製圖片的基礎是這個圖片已經被加載。

5、利用canvas其他方法

canvas中提供的有關圖形繪製的方法還有很多,這裏不能一一列舉, 但是有必要介紹幾個常用的方法,具體如下:

(1) clip() 方法

clip()方法用於從原始畫布剪切任意形狀和尺寸的區域,具體使用方法如示例所示。
【示例】 clip()剪切任意形狀和尺寸區域

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>clip()剪切任意形狀和尺寸區域</title>
</head>
<body>
<canvas id="cavsElem" width="400" height="300" >
    你的瀏覽器不支持canvas,請升級瀏覽器
</canvas>
<script>
    //獲得畫布
    var canvas=document.getElementById('cavsElem');
    //設置畫布邊框
    canvas.style.border="1px solid #000";
    //獲取上下文
    var context = canvas.getContext('2d');
    // 剪切矩形區域
    context.rect(50,20,200,120);//(x,y,width,height)
    context.stroke();//描邊
    context.clip();
    // 在 clip()之後繪製圓形,只有被剪切區域的內圓形可見
    context.arc(200,100,70,0,2*Math.PI,true);//(x,y,半徑,開始弧度,結束弧度,true代表逆時針繪製圓形)
    context.fillStyle="pink";
    context.fill();//填充
</script>
</body>
</html>

用Chrome瀏覽器打開示例,頁面效果如圖所示。
在這裏插入圖片描述
圖 示例頁面效果

(2)save() 和restore()方法

在canvas繪製圖形的過程中,有時網頁需要多次顯示相同的效果,例如繪製圓形後繪製矩形,然後在觸發某個事件時需要回到繪製圓形的狀態,這時就用到了save() 和restore()方法,save() 用來保存畫布的繪製狀態,例如保存繪製一個圓形的狀態,當繪製矩形後需要回到之前的狀態,這時可以使用restore()方法。Restore()方法用於移除自上一次調用save()方法所添加的任何效果。


超全面的測試IT技術課程,0元立即加入學習!有需要的朋友戳:


騰訊課堂測試技術學習地址

歡迎轉載,但未經作者同意請保留此段聲明,並在文章頁面明顯位置給出原文鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章