日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
HTML5新特性Canvas入門秘籍

隨著IE 10的即將發(fā)布正式版,標(biāo)志者HTML5的時(shí)代已經(jīng)越來離我們?cè)絹碓浇?,盡管HTML 5的最終標(biāo)準(zhǔn)草案還沒最終敲定,但象Chrome,Firefox等瀏覽器對(duì)HTML5的標(biāo)準(zhǔn)已經(jīng)支持的十分完善了,IE 10的預(yù)覽版本也聲稱支持更多的HTML 5特性。在此情況下,無論作為CTO還是一般的前端頁面開發(fā)者還是網(wǎng)站編程的開發(fā)人員,都應(yīng)該開始給予HTML5相當(dāng)?shù)闹匾暋6贖TML5中,其中最令開發(fā)者和用戶值得留意的新特性,莫過于Canvas的功能了,它能在目前的IE 9,IE 10以及Chrome,FireFox等多種瀏覽器中使用,是目前HTML5中富客戶端動(dòng)畫效果的實(shí)現(xiàn)方式,有了它,HTML5就有了跟Adobe Flash對(duì)抗的資本,用戶以后只要使用支持HTML5的瀏覽器,就可以不用安裝Flash插件了。那么,究竟什么是HTML 5中的Canvas功能呢?本文將帶領(lǐng)初學(xué)者學(xué)習(xí)Canvas的入門知識(shí)。

站在用戶的角度思考問題,與客戶深入溝通,找到西峽網(wǎng)站設(shè)計(jì)與西峽網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋西峽地區(qū)。

推薦專題:HTML 5 下一代Web開發(fā)標(biāo)準(zhǔn)詳解

走近Canvas 元素標(biāo)簽

官方對(duì)Canvas元素標(biāo)簽的定義為:Canvas(畫布)可以用來進(jìn)行繪制圖形,繪制游戲的圖案或者其他圖形圖案,允許使用腳本動(dòng)態(tài)渲染點(diǎn)陣圖像。簡(jiǎn)單來說,Canvas就是允許你在HTML5中,使用Javascript去繪制你喜歡的任何圖形了,包括文字,圖片、線、點(diǎn)、各種形狀等。Canvas使用的是Canvas 2D API去繪制圖形的,這個(gè)API功能十分強(qiáng)大,而且大部分的瀏覽器都支持 2D canvas ——包括 Opera, Firefox, Konqueror 和 Safari。而且某些版本的 Opera 還支持 3D canvas ,firefox 也可以通過插件形式支持 3D canvas 。下面馬上來看Canvas的例子。

 
 
 
 
  1.  

這個(gè)代碼就會(huì)在瀏覽器中先繪畫一張畫布,寬度和高度都是300px,但這個(gè)時(shí)候頁面上并不能顯示什么效果,只是一個(gè)空的區(qū)域。

在一個(gè)頁面中,可以有不同的canvas,不同的canvas都必須有自己的id屬性以示區(qū)分。為了在canvas上繪制圖形,必須引用canvas的上下文context變量。Context上下文能讓你訪問2D API中的屬性和方法,這樣就可以在畫布元素中操作和繪畫圖形了,這個(gè)我們稍后再詳細(xì)講解。

先來看下每一canvas元素標(biāo)簽中都有X和Y坐標(biāo),X坐標(biāo)代表水平,Y坐標(biāo)代表垂直,下圖是其坐標(biāo)系的圖:

Canvas和SVG的關(guān)系

開發(fā)者必須清楚SVG技術(shù)和canvas是不同的。SVG是基于XML的圖形矢量顯示技術(shù),可以將其與CSS混搭使用,也可以使用SVG DOM動(dòng)態(tài)向其添加行為。而canvas則允許使用Javascript去繪制各種圖象和圖形,下面是一些canvas勝過svg的優(yōu)點(diǎn):

1) canvas在繪制復(fù)雜圖象時(shí),繪畫速度比SVG快不少。

2) 可以保存canvas繪制的圖象,但SVG不能直接使用瀏覽器的保存功能保存。

3) 在canvas中所有東西都以象素形式存在。

4) svg需要在瀏覽器中使用插件顯示。

但要同時(shí)注意到,svg也有自身的優(yōu)勢(shì),比如:

1) svg的圖形解析分辨率能適應(yīng)不同大小尺寸。

2) svg由于使用XML,因此能定義很多不同的目標(biāo)元素。

3) svg能繪制很復(fù)雜的動(dòng)畫效果。

那如何選擇呢?建議如果你的網(wǎng)站的圖象對(duì)分辨率要求高(矢量圖要求),那么選擇SVG,如果你的應(yīng)用是網(wǎng)頁游戲等對(duì)速度要求響應(yīng)高的,也不想過多跟XML打交道的話,則選用canvas。更多關(guān)于如何選擇SVG和Canvas,可以參考這篇文章的論述:http://blogs.msdn.com/b/ie/archive/2011/04/22/thoughts-on-when-to-use-canvas-and-svg.aspx

Canvas和硬件加速

在學(xué)習(xí)canvas時(shí),建議讀者閱讀這篇文章《硬件加速下的圖形顯示對(duì)比》,這篇文章中對(duì)比了HTML5下canvas在各瀏覽器下的渲染表現(xiàn)。在早期的瀏覽器中,所有對(duì)圖形的顯示運(yùn)算都是有CPU去實(shí)現(xiàn)的,而隨著互聯(lián)網(wǎng)的快速發(fā)展,對(duì)圖形處理的要求越來越高,于是很多的圖形渲染工作都由圖形處理單元(GPU)去處理了,比如使用Direct2D或者DirectWrite。當(dāng)圖形處理工作大部分交由GPU去處理時(shí),大大減輕了CPU的工作負(fù)擔(dān),可以騰出來做其他更復(fù)雜的工作。

Javascript一直被指責(zé)在處理圖形方面遜色,但隨著FireFox,Chrome等瀏覽器的大行其道,還有IE 9的新的Javascript引擎Chara,它采用在后臺(tái)與IE并行并且獨(dú)立的CPU內(nèi)核中編譯 JavaScript 腳本,采用單獨(dú)的后臺(tái)線程進(jìn)行編譯。采用這種方法,可以充分利用現(xiàn)在的多核處理器功能。開發(fā)人員可以不用更改任何現(xiàn)有的代碼即可利用現(xiàn)有計(jì)算機(jī)硬件的帶來的性能提升。

因此,有了瀏覽器在GPU方面的加速功能,就能為HTML5的canvas的使用提供很好的環(huán)境。

當(dāng)向canvas發(fā)出繪畫命令時(shí),瀏覽器直接將指令發(fā)到圖形加速器而不需要開發(fā)者更多的干預(yù),硬件圖形加速器則以難以置信的運(yùn)算速度實(shí)時(shí)繪畫和渲染圖形??梢酝ㄟ^閱讀下文來了解更多的在不同瀏覽器之間的硬件加速測(cè)試的具體情況(地址:http://ie.microsoft.com/testdrive/Performance/Paintball/Default.html)

Canvas 2D API

canvas 2D API對(duì)象允許開發(fā)者繪制各種圖片和圖形。調(diào)用時(shí),需要通過getContext方法獲得其上下文,這個(gè)方法中有一個(gè)參數(shù),目前是2d,調(diào)用的代碼如下:

 
 
 
 
  1. var myCanvas = document.getElementById(“myCanvas”);  
  2.   var context = myCanvas.getContext(“2d”); 

由于每一個(gè)canvas元素都有自己的上下文context,因此如果一個(gè)頁面中有多個(gè)canvas的話,必須對(duì)每一個(gè)canvas都按上面的方法獲得其context。除此之外,canvas api有如下的若干重要方法:

形狀變換類的方法

◆ scale –允許對(duì)當(dāng)前canvas對(duì)象進(jìn)行形狀大小變換

◆ rotate –允許對(duì)當(dāng)前的canvas對(duì)象繞 x軸和y軸旋轉(zhuǎn)。

狀態(tài)變換類方法

◆ save – 保存當(dāng)前canvas的狀態(tài)

◆ restore –恢復(fù)上一個(gè)已保存的canvas的狀態(tài)

文字類方法

◆ font –設(shè)置或獲得當(dāng)前canvas的字體

◆ fillText –向當(dāng)前canvas填充文字

◆ measureText –獲得指定文字的寬度

更多的關(guān)于canvas 2D API的用法,可以參考這個(gè)頁面http://msdn.microsoft.com/en-us/library/ff975057.aspx)。下面,我們開始學(xué)習(xí)如何使用這些API去繪制圖形。

#p#

繪制形狀和顏色

首先,學(xué)習(xí)下如何畫矩形,下面是相關(guān)的方法:

1) fillRect(x, y, w, h),使用當(dāng)前樣式去繪制一個(gè)矩形并對(duì)其進(jìn)行填充,其中x,y,w,h分別是X,Y坐標(biāo)和寬度高度坐標(biāo)。

2)strokeRect(x, y, w, h),使用當(dāng)前的輪廓樣式去勾畫一個(gè)矩形,注意這里是用線條去勾畫,而不是去填充一個(gè)矩形。

3)clearRect(x, y, w, h),在當(dāng)前的畫布中清除矩形的內(nèi)容。

畫矩形最簡(jiǎn)單的方法是用fillRect方法了,如下代碼:

 
 
 
 
  1. var canvas = document.getElementById(“myCanvas”);  
  2.   var context = canvas.getContext(“2d”);  
  3.  context.fillRect(5, 5, 145, 145);  

則在X=5,Y=5的坐標(biāo)系中畫出一個(gè)145*145的矩形,如下圖:

如果不指定顏色,默認(rèn)的是使用黑色去填充整個(gè)矩形。可以使用fillStyle方法為矩形指定顏色或其他樣式,比如可以充分利用CSS 3中的opacity透明度屬性,比如如下的代碼,分別畫了三個(gè)矩形,每個(gè)矩形的下半部分都使用了樣式形成了半透明效果:

 
 
 
 
  1. context.fillRect(5, 5, 145, 145);  
  2. context.fillStyle = “rgb(0, 162, 232)”;  
  3. context.fillRect(40, 55, 145, 145);  
  4. context.fillStyle = “rgba(255, 0, 0, 0.2)”;  
  5. context.fillRect(75, 105, 145, 145); 

其中rgba中比傳統(tǒng)的rgb多了a,即透明度的含義,a的值也是0到1之間的數(shù)字,0表示完全透明,1則是完全不透明。運(yùn)行結(jié)果如下圖:

接下來學(xué)習(xí)如何繪制圓(弧),繪制用到的方法如下:

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

畫圓或者圓弧。x,y為圓心坐標(biāo),radius為半徑,startAngle,endAngle為開始/結(jié)束劃圓的角度,anticlockwise為是否逆時(shí)針畫圓(True為逆時(shí)針,F(xiàn)alse為順時(shí)針)。

注意這里的角度為弧度制,所以如果畫一個(gè)正圓的話,是Math.PI * 2,而畫60°的話,就是60 * Math.PI / 180,比如下面的代碼,用fill樣式填充了一個(gè)黑色的正圓:

 
 
 
 
  1. context.beginPath();  
  2. context.fillStyle = “rgb(0, 0, 0)”;  
  3. context.arc(123, 93, 70, 0, 2 * Math.PI, true);  
  4. context.fill(); 

如果要用stroke筆來勾畫圓形的話,只需要指定勾畫的樣式strokeStyle即可,如下代碼:

 
 
 
 
  1. context.beginPath();  
  2. context.strokeStyle = “rgb(0, 0, 0)”;  
  3. context.arc(123, 93, 70, 0, 2 * Math.PI, true);  
  4. context.stroke();  

下面是一個(gè)畫弧度的代碼例子:

 
 
 
 
  1. context.beginPath();  
  2. context.strokeStyle = “rgb(0, 0, 0)”;  
  3. context.arc(123, 93, 70, 0, 0.5 * Math.PI, true);  
  4. context.stroke(); 

結(jié)果如下圖:

接下來,我們學(xué)習(xí)如何畫貝塞爾曲線。HTML 5的API中,有一個(gè)畫這個(gè)曲線的很容易的方法bezierCurveTo,相關(guān)參數(shù)介紹如下:

bezierCurveTo (cp1x, cp1y, cp2x, cp2y, x, y):為一個(gè)畫布的當(dāng)前子路徑添加一條三次貝塞爾曲線。這條曲線的開始點(diǎn)是畫布的當(dāng)前點(diǎn),而結(jié)束點(diǎn)是 (x, y)。兩條貝塞爾曲線控制點(diǎn) (cpX1, cpY1) 和 (cpX2, cpY2) 定義了曲線的形狀。當(dāng)這個(gè)方法返回的時(shí)候,當(dāng)前的位置為 (x, y)。下面是相關(guān)代碼:

 
 
 
 
  1. context.lineWidth = 20;  
  2. context.beginPath();  
  3. context.moveTo(5, 50);  
  4. context.bezierCurveTo(30, 30, 130, 530, 200, 100);  
  5. context.stroke(); 

繪畫的圖形如下圖:

由于有了貝塞爾曲線功能的,因此可以繪制很多不同的圖形了,比如下面的代碼繪制出一個(gè)簡(jiǎn)單的笑臉圖。

 
 
 
 
  1. // 繪畫臉部輪廓  
  2.   context.beginPath();  
  3.   context.lineWidth = 10;  
  4.   context.strokeStyle = “rgb(0, 0, 0)”;  
  5.   context.arc(200, 233, 150, 0, 2 * Math.PI, true);  
  6.   context.stroke();  
  7.   // 填充面部顏色  
  8.   context.beginPath();  
  9.   context.fillStyle = “rgba(80, 100, 80, 0.4)”;  
  10.   context.arc(200, 233, 150, 0, 2 * Math.PI, true);  
  11.   context.fill();  
  12.   // 繪制右眼  
  13.   context.lineWidth = 20;  
  14.   context.beginPath();  
  15.   context.moveTo(230, 130);  
  16.   context.bezierCurveTo(230, 130, 230, 130, 240, 200);  
  17.   context.stroke();  
  18.   // 繪制左眼  
  19.   context.beginPath();  
  20.   context.moveTo(170, 130);  
  21.   context.bezierCurveTo(170, 130, 170, 130, 160, 200);  
  22.   context.stroke();  
  23.   // 繪制上唇  
  24.   context.beginPath();  
  25.   context.moveTo(100, 230);  
  26.  context.bezierCurveTo(100, 230, 200, 380, 300, 230);  
  27.  context.stroke();  
  28.  // 繪制下唇  
  29.  context.beginPath();  
  30.  context.moveTo(100, 235);  
  31.  context.bezierCurveTo(105, 270, 200, 480, 300, 232);  
  32.  context.stroke(); 

顯示結(jié)果如下圖:

目前為止,我們使用的fillStyle都是使用一種單獨(dú)的顏色去填充圖形,而實(shí)際上,fillStyle也支持使用多種顏色去填充,比如下面的例子,隨機(jī)生成了各種顏色去填充畫布實(shí)現(xiàn)了彩虹的效果:

 
 
 
 
  1. var a = 1;  
  2.   for (j = 0; j < 100; j++) {  
  3.   var r = 255, g = 0, b = 0;  
  4.   for (i = 0; i < 150; i++) {  
  5.   // 黃色  
  6.   if (i < 25) g += 10.2;  
  7.   // 綠色  
  8.   else if (i >= 25 && i < 50) r -= 10.2;  
  9.   // 藍(lán)色  
  10.   else if (i >= 50 && i < 75) {  
  11.   g -= 10.2;  
  12.  b += 10.2;  
  13.   }  
  14.   // 紫色  
  15.   else if (i >= 75 && i < 100) r += 10.2;  
  16.   // 紅色  
  17.   else b -= 10.2;  
  18.   context.fillStyle = “rgba(” + Math.floor(r) + “,” +  
  19.   Math.floor(g) + “,” + Math.floor(b) + “,” + a + “)”;  
  20.   context.fillRect(3 * i, 5 * j, 3, 5); } a -= 0.01; } 

如果不想使用以上的方法去生成漸變顏色,可以使用如下的canvas提供的幾個(gè)方法去簡(jiǎn)便實(shí)現(xiàn)漸變效果:

addColorStop(offset, color) –addColorStop 方法接受 2 個(gè)參數(shù),offset參數(shù)必須是一個(gè) 0.0 與 1.0 之間的數(shù)值,表示漸變中顏色所在的相對(duì)位置。例如,0.5 表示顏色會(huì)出現(xiàn)在正中間。color 參數(shù)必須是一個(gè)有效的 CSS 顏色值

createLinearGradient(x0, y0, x1, y1) –該方法接受 4 個(gè)參數(shù),表示漸變的起點(diǎn) (x1,y1) 與終點(diǎn) (x2,y2)。

createRadialGradient(x0, y0, r0, x1, y1, r1) – 該方法接受 6 個(gè)參數(shù),前三個(gè)定義一個(gè)以 (x1,y1) 為原點(diǎn),半徑為 r1 的圓,后三個(gè)參數(shù)則定義另一個(gè)以 (x2,y2) 為原點(diǎn),半徑為 r2 的圓。

下面的代碼演示了使用漸變的效果:

 
 
 
 
  1. var gradient = context.createLinearGradient(0, 0,0, 145);  
  2. gradient.addColorStop(0, “#00ABEB”);  
  3. gradient.addColorStop(0.5, “yellow”);  
  4. gradient.addColorStop(0.8, “green”);  
  5. gradient.addColorStop(1, “white”);  
  6. context.fillStyle = gradient;  
  7. context.fillRect(5, 5, 145, 145);  

實(shí)現(xiàn)的效果如下圖:

原文:http://tech.it168.com/a2011/1108/1270/000001270295_all.shtml


網(wǎng)頁名稱:HTML5新特性Canvas入門秘籍
標(biāo)題URL:http://www.dlmjj.cn/article/dpjhjij.html