canvas動(dòng)畫包教不包會(huì):canvas概述和動(dòng)畫基本概念

2018-06-20 10:56 更新
這篇文章是《canvas動(dòng)畫包教不包會(huì)》系列的第一篇文章,也是我們真正進(jìn)入動(dòng)畫世界的開始!不知道你是不是很興奮,反正對(duì)于愛(ài)瞎折騰的我來(lái)說(shuō),一定會(huì)在開發(fā)學(xué)習(xí)中很high!

廢話不多說(shuō),下面進(jìn)入主題。

canvas元素是HTML5中新出現(xiàn)的,我們可以將其當(dāng)做一個(gè)像素級(jí)的畫布,它

允許我們繪制直線、圓、矩形等基本形狀,以及圖像和文字。使用canvas元素,

可以實(shí)時(shí)渲染圖形、游戲動(dòng)畫或其他虛擬圖像

,而且它已經(jīng)為快速繪圖做過(guò)優(yōu)化了。各大主流瀏覽器都已經(jīng)支持GPU加速的2D canvas渲染,因此,使用canvas繪制出的游戲動(dòng)畫運(yùn)行速度會(huì)很快。



兼容性:


在《canvas動(dòng)畫包教不包會(huì)》系列,我們主要是使用HTML5 canvas和JavaScript技術(shù)。如果你對(duì)這兩canvas和JavaScript還很陌生,建議先去了解熟悉一下,你可以看我的文章來(lái)了解:《canvas入門基礎(chǔ)系列》和《JavaScript學(xué)習(xí)筆記》,也可以到《HTML5 Canvas》和《JavaScript教程》,當(dāng)然,還有很多優(yōu)秀的書籍、文章和教程,自主選擇學(xué)習(xí)!

一、canvas
在canvas上繪制動(dòng)畫的基本文檔結(jié)構(gòu):

<!DOCTYPE html>  

<html lang="en">  

<head>   

  <meta charset="UTF-8">   

  <title></title>  

</head>  

<body>   

  <canvas id="canvas" width="400" height="500">   

    <P>你的瀏覽器不支持“canvas”!</P>   

  </canvas>   

  <script>   

    window.onload = function(){   

      var canvas = document.getElementById('canvas');  // 獲取canvas元素

      var ctx = canvas.getContext('2d');  // 獲取'2d'context對(duì)象

      // 繪畫代碼

    }; 

  </script>  

</body>  

</html>


下面簡(jiǎn)要的羅列一下canvas API

rect( x, y, width, height )   繪制矩形

fillRect( x, y, width, height )  繪制被填充的矩形

strokeRect( x, y, width, height )  繪制矩形(無(wú)填充)

clearRect( x, y, width, height ) 清除指定的矩形內(nèi)的像素


fill()  填充當(dāng)前繪圖(路徑)

stroke() 繪制已定義的路徑

beginPath()  起始(重置)當(dāng)前路徑

moveTo( x, y )  將筆觸移動(dòng)到指定的坐標(biāo)(x,y)

lineTo( x, y )  繪制一條從當(dāng)前位置到指定的坐標(biāo)(x,y)的直線

clip()  從原始畫布剪切任意形狀和尺寸的區(qū)域

quadraticCurveTo()  創(chuàng)建二次貝塞爾曲線

bezierCurveTo()   創(chuàng)建三次貝塞爾曲線

arc( x, y, radius, startAngle, endAngle, anticlockwise)  繪制圓或圓弧

arcTo( x1, y1, x2, y2, radius)  根據(jù)給定點(diǎn)畫圓弧,再以直線連接兩個(gè)點(diǎn)

isPointInPath( x, y )  檢測(cè)指定的點(diǎn)是否在當(dāng)前路徑中,在則返回true。


fillStyle  設(shè)置或返回用于填充繪畫的顏色、漸變或模式

strokeStyle  設(shè)置或返回用于筆觸的顏色、漸變或模式

shadowColor  設(shè)置或返回用于陰影的顏色

shadowBlur   設(shè)置或返回用于陰影的模糊級(jí)別

shadowOffsetX  設(shè)置或返回陰影與形狀的水平距離

shadowOffsetY  設(shè)置或返回陰影與形狀的垂直距離


lineCap  設(shè)置或返回線條的結(jié)束點(diǎn)樣式(butt、round、square)

lineJoin  設(shè)置或返回當(dāng)兩條線交匯時(shí),邊角的類型(bevel、round、miter)

lineWidth  設(shè)置或返回當(dāng)前的線條寬度

miterLimit  設(shè)置或返回最大斜接長(zhǎng)度


createLinearGradient( x0, y0, x1, y1 )  創(chuàng)建線性漸變

createPattern( image/canvas/video, repeat )  在指定的方向內(nèi)重復(fù)繪制指定的元素

createRadialGradient( x0, y0, r0, x1, y1, r1 ) 創(chuàng)建徑向漸變

addColorStop( stop, color )  規(guī)定漸變對(duì)象中的顏色和停止位置


font  設(shè)置或返回文本內(nèi)容的當(dāng)前字體屬性(和css的font一樣)

textAlign  設(shè)置或返回文本內(nèi)容的當(dāng)前對(duì)齊方式

textBaseline  設(shè)置或返回在繪制文本時(shí)使用的當(dāng)前文本基線

fillText( text, x, y )  在畫布上繪制“被填充”的文本

strokeText( text, x, y )  在畫布上繪制文本(無(wú)填充)

measureText( text )  返回包含指定文本寬度的對(duì)象(屬性width獲取寬度)


drawImage( image/canvas, x, y )、drawImage( image/canvas, x, y, width, height )、drawImage( image/canvas, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight )  在畫布上繪制圖像、畫布或視頻


createImageData( width, height )、createImageData(imageData)  繪制ImageData對(duì)象

getImageData( x, y, width, height )  返回ImageData對(duì)象,該對(duì)象為畫布上指定的矩形復(fù)制像素?cái)?shù)據(jù)。

putImageData( ImageData, x, y )、putImageData( imageData, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight )  把圖像數(shù)據(jù)放回畫布上。

width  返回ImageData對(duì)象的寬度

height  返回ImageData對(duì)象的高度

data  返回一個(gè)對(duì)象,包含指定的ImageData對(duì)象的圖像數(shù)據(jù)


globalAlpha  設(shè)置或返回繪圖的當(dāng)前alpha或透明度

globalCompositeOperation  設(shè)置或返回新圖像如何繪制到已有的圖像上。


scale( x, y )  縮放當(dāng)前繪圖

translate( x, y )  重新設(shè)置畫布上的(0,0)位置

rotate( angle )  選擇當(dāng)前繪圖,單位為“弧度”,角度轉(zhuǎn)弧度公式( degrees*Math.PI/180)

transform( m11, m12, m21, m22, dx, dy )  替換繪圖的當(dāng)前轉(zhuǎn)換矩陣

setTransform()  將當(dāng)前轉(zhuǎn)換重置為單元矩陣,然后運(yùn)行transform()


save()  保存當(dāng)前環(huán)境的狀態(tài)

restore()  恢復(fù)之前保存過(guò)的路徑狀態(tài)和屬性


getContext('2d')  獲取2d對(duì)象

toDataURL()  將canvas轉(zhuǎn)換成圖片,返回地址


只要你熟練的使用上面這些canvas API,你就能實(shí)現(xiàn)很多酷炫的動(dòng)畫。

二、動(dòng)畫(animation)的基礎(chǔ)概念

動(dòng)畫,其實(shí)是一個(gè)創(chuàng)造運(yùn)動(dòng)假象的過(guò)程,通俗講就是,動(dòng)畫是由一幅幅不同的靜態(tài)畫面以極快的速度連續(xù)播放從而產(chǎn)生物體運(yùn)動(dòng)或變化。由于快速頻率,我們的眼睛就會(huì)欺騙我們的大腦,也就是前面說(shuō)的運(yùn)動(dòng)假象。

每一幅靜態(tài)畫面我們稱做一“”。(gif圖的原理就一幀一幀的存儲(chǔ),然后播放)

上面是動(dòng)畫的基礎(chǔ)概念,那如何在canvas上產(chǎn)生動(dòng)畫呢?

首先,我們要知道實(shí)現(xiàn)動(dòng)畫的步驟,一般分為四步:
  1. 清空canvas(使用clearRect()或全圖繪制)
  2. 保存canvas狀態(tài)(可選)
  3. 繪制動(dòng)畫圖形
  4. 恢復(fù)canvas狀態(tài)(一般在第二步的基礎(chǔ)上使用)

在了解繪制步驟后,我還需要了解三種用來(lái)繪制動(dòng)畫的方法:

(1)使用時(shí)間控制器

setInterval( function, delay )


setTimeout( function, delay )

具體用法在這里就不多說(shuō)了,不熟悉的請(qǐng)先去學(xué)習(xí)一下JavaScript,不是看不起你,而是沒(méi)JavaScript基礎(chǔ),是很難開發(fā)動(dòng)畫的。

(2)循環(huán)本身

window.requestAnimationFrame( function )

requestAnimationFrame()是一個(gè)新的API,和setInterval差不多,但是使用requestAnimationFrame(),你必須主動(dòng)采用循環(huán)調(diào)用自身。

requestAnimationFrame()不需要設(shè)置時(shí)間,它會(huì)根據(jù)瀏覽器的刷新頻率自動(dòng)調(diào)整動(dòng)畫的時(shí)間間隔,一般只有十幾毫秒,可用它來(lái)做逐幀動(dòng)畫。

window.requestAnimationFrame = (function() {   

  return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) {   

    window.setTimeout(callback, 1000 / 60);   

  };   

})();


還有個(gè)停止requestAnimationFrame()動(dòng)畫的方法cancelAnimationFrame(ID),參數(shù)ID是調(diào)用requestAnimationFrame()返回來(lái)的ID值:

window.cancelAnimationFrame = (window.cancelRequestAnimationFrame || window.webkitCancelAnimationFrame || window.webkitCancelRequestAnimationFrame || window.mozCancelAnimationFrame || window.mozCancelRequestAnimationFrame || window.msCancelAnimationFrame || window.msCancelRequestAnimationFrame || window.oCancelAnimationFrame || window.oCancelRequestAnimationFrame || window.clearTimeout);


像我的個(gè)人主頁(yè)上的粒子效果就是用requestAnimationFrame()方法來(lái)實(shí)現(xiàn)的,我也單獨(dú)做了一個(gè)粒子效果頁(yè)面:粒子效果

總結(jié)
  • 要實(shí)現(xiàn)動(dòng)畫,一定要熟練的使用canvas API和對(duì)JavaScript有一定的了解。
  • 動(dòng)畫的實(shí)質(zhì)就是由一幅幅不同的靜態(tài)畫面以極快的速度連續(xù)播放從而產(chǎn)生物體運(yùn)動(dòng)或變化。

下一章將會(huì)了解《用戶交互》!

如有問(wèn)題,歡迎在下面的評(píng)論區(qū)評(píng)論!


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)