在使用Canvas 2D Context之前,先看看他有哪些能耐。
2D Context有一些全域屬性,這些屬性會與許多繪圖的動作相關,為了方便管理,2D Context提供了一個簡單的方法:用save()就可以把目前的環境存到堆疊,然後呼叫restore()就可以取出之前放入堆疊的屬性。這是一個堆疊的操作,所以save()就相當於push的動作,restore()則相當於pop的動作。save跟restore只會影響到一些全域的屬性,跟繪圖,尤其是已繪製的圖形是沒有關係的,並不能用來做undo。
一些最常用的屬性包含:
另外,有一些無法直接操作的屬性,例如變形矩陣,必須透過一些方法來操作,但是也屬於內建的全域屬性。
這些屬性,都可以透過save()與restore()來操作。
接下來看一些繪製方法,首先是與路徑相關的:
要繪製矩型的話,並不需要呼叫繪製路徑的方法,可以直接使用:
另外,可以用2D Context來畫出文字:
2D Context有內建一個全域的變換矩陣,透過操作這個變換矩陣,就可以讓繪製出來的圖形做出放大、縮小、平移、旋轉、剪變等效果。改變變換矩陣並不影響已經繪製到Canvas上的圖形,只是影響到及將會至到Canvas圖形的座標系統。這些方法包括:
除了繪圖的方法,2D Context也提供了一些快速繪圖的機制:
要做進一步的圖形處理,就需要可以取得Canvas中所有Pixel來做處理,2D Context在這方面提供幾個方法,主要是透過ImageData這個物件,他的data屬性是包含所有像素的一維陣列,每四個陣列元素可以組成一個Pixel(也就是RGBA):
有一些功能沒有提到(focus ring等,不過這跟shadow有點像),但是大部分Canvas 2D Context大概都簡單介紹到了。基本上這已經涵蓋了大部分的2D繪圖需求,可以很快就實作出一些繪圖功能,要做出類似小畫家的應用也沒問題。
明天就從塗鴉開始,實作一些簡單的繪圖應用,並且把這些功能慢慢組織起來成為有彈性的繪圖框架,讓未來要整合多人協作時會更方便。