本篇內(nèi)容主要講解“Canvas 2D原理是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Canvas 2D原理是什么”吧!
阜平ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
Web之前有一些常見的繪圖方式,如Adobe Flash、SVG和VML,此次HTML5元素新添加的Canvas實(shí)際上是一個(gè)位圖畫布(bitmap canvas)。與SVG不同,畫在Canvas上的元素?zé)o法進(jìn)行縮放,同時(shí)也不是DOM的一部分。
Canvas能夠成為Web繪圖標(biāo)準(zhǔn),原因有二:其一,由于不用存儲(chǔ)畫出的每一個(gè)元素,所以性能更好;其二,與其他語言的二維繪圖API類似,Canvas更容易實(shí)現(xiàn)。
很多時(shí)候,大家都不太注重原理性的文章,我們希望讀者能夠擁有很強(qiáng)的動(dòng)手能力,但是我們也非常希望讀者在動(dòng)手的時(shí)候能夠明白一件事情的工作原理。因此,本章特意列出一節(jié),簡(jiǎn)單講解Canvas的工作原理。
眾所周知,Canvas主要是用來畫圖的,但是Canvas并不非常注重動(dòng)畫。目前世面上所有的Canvas動(dòng)畫完全取決于開發(fā)人員的水平和功力。在Canvas中沒有幀(frame)的概念,沒有精靈(sprite)的概念,很多慣用Flash做動(dòng)畫的人所熟知的概念在Canvas中都不存在。但是Canvas的無插件跨平臺(tái)運(yùn)行能力是Flash無法比擬的。
基于Canvas的繪圖并不是直接在Canvas標(biāo)記所創(chuàng)建的繪圖畫面上進(jìn)行各種繪圖操作,而是依賴畫面所提供的渲染上下文(rendering context),所有的繪圖命令和屬性都定義在渲染上下文當(dāng)中。當(dāng)使用Canvas的getContext("2d")方法時(shí),其返回的是CanvasRenderingContext2D對(duì)象,其內(nèi)部表現(xiàn)為笛卡兒平面坐標(biāo),并且左上角坐標(biāo)為(0, 0)。注意:在利用Canvas畫圖時(shí),通過Canvas的ID屬性獲取相應(yīng)的DOM對(duì)象之后要做的事情就是獲取Context對(duì)象。
渲染上下文與Canvas是完全對(duì)應(yīng)存在的,無論對(duì)同一Canvas對(duì)象調(diào)用幾次getContext()方法,都將返回同一個(gè)渲染上下文對(duì)象。目前,所有支持Canvas的瀏覽器都支持2D渲染上下文。
Canvas 繪圖是一種像素級(jí)的位圖繪圖技術(shù),Canvas標(biāo)簽只是在網(wǎng)頁中定義了一塊矩形區(qū)域,
開發(fā)者使用JavaScript完成各種圖形繪制操作。
注意 目前網(wǎng)上一些聲稱Canvas是矢量繪圖的說法是錯(cuò)誤的,無論Canvas是直接載入圖片還是繪制一個(gè)線條,其最終表現(xiàn)結(jié)果都是一個(gè)位圖,絕非有些文章所說的矢量圖,這是原理性常識(shí),請(qǐng)讀者自鑒。
在所有狀態(tài)模式下繪圖都會(huì)有一個(gè)繪圖狀態(tài),Canvas的繪圖狀態(tài)內(nèi)容很豐富。在介紹Canvas的繪圖狀態(tài)時(shí),如果有讀者對(duì)繪圖狀態(tài)這個(gè)詞不太了解,可以借助狀態(tài)一詞的中文解釋去理解。這里,顯擺一下我們對(duì)語言的理解:狀態(tài),就是所處的狀況,是空間和自身表現(xiàn)的描述,對(duì)狀態(tài)
所處時(shí)間的定義則不明,按需而定。
每個(gè)渲染上下文都是一個(gè)繪圖狀態(tài)的集合(堆),繪圖狀態(tài)包含變形矩陣(transform matrix)、裁剪區(qū)域(clipping region)及眾多的屬性。但是,當(dāng)前路徑和當(dāng)前位圖不是繪圖狀態(tài)的一部分,當(dāng)前路徑是持久存在的,僅能被beginPath()、closePath()復(fù)位,當(dāng)前位圖是Canvas的屬性,而非渲染上下文的。
在學(xué)習(xí)Canvas繪圖的過程中,常常會(huì)有人對(duì)Canvas的restore和save的作用理解不明,而且對(duì)繪制與擦除行為也存在疑惑,
下圖對(duì)這些疑惑給出了解釋,并對(duì)繪圖的先后關(guān)系、上下關(guān)系、合成等做了解釋。
由此可知,最早發(fā)出的命令,在最下;堆疊后不可逆向;擦除行為是針對(duì)某一區(qū)域下所有已繪內(nèi)容的。
Canvas坐標(biāo)系統(tǒng)說明
前文已經(jīng)說過,Canvas的本質(zhì)是一個(gè)笛卡兒坐標(biāo)系統(tǒng),本節(jié)將詳細(xì)說明這一點(diǎn)。矩形區(qū)域的左上角為坐標(biāo)原點(diǎn)(0,0),向右為x軸,向下為y 軸。
Canvas繪圖坐標(biāo)系統(tǒng)如下圖所示:
Canvas繪圖坐標(biāo)圖
從這張圖中可以看到,生活中常用的坐標(biāo)和定位方式已經(jīng)發(fā)生變化了。在Canvas作圖概念中,沒有負(fù)坐標(biāo),只有正坐標(biāo)。而且,坐標(biāo)的起點(diǎn)在左上角以(0,0)坐標(biāo)開始。由于起點(diǎn)是左上角,因此,任何圖形的繪制都是向右向下的。初學(xué)者容易在這個(gè)坐標(biāo)系統(tǒng)上犯錯(cuò)誤,希望大家注意這一點(diǎn)。
Canvas屬性說明
Canvas有各種屬性,這些屬性的名稱和簡(jiǎn)單描述如下:
fillStyle 填充屬性,主要為填充方法服務(wù)
strokeStyle 繪制屬性,主要為繪制方法服務(wù)
font 字體樣式定義
globalAlpha 圖形透明度設(shè)置
globalCompositeOperation 前后繪制的圖形組合顯示的效果
lineCap 線帽
lineJoin 兩條線段連接處的樣式,它可以有3種選擇,即round、bevel和miter,與
lineCap是組合屬性,默認(rèn)是miter
lineWidth 線的寬度
miterLimit 定義斜連線長(zhǎng)度和線條寬度的最大比率,這個(gè)屬性只有當(dāng)lineJoin='miter'時(shí)才有
shadowBlur 陰影模糊
shadowColor 陰影色彩
shadowOffsetX 陰影橫向偏移
shadowOffsetY 陰影縱向偏移
textAlign 文本水平對(duì)齊
textBaseline 文本垂直對(duì)齊
注意,上面的屬性名稱中凡是有g(shù)lobal字樣的,如globalAlpha,都是全局屬性,在使用時(shí)一定要注意先save()再restore(),即如果使用了save()方法,就一定要有restore()方法與之對(duì)應(yīng)。
到此,相信大家對(duì)“Canvas 2D原理是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!