一、Surface
Surface就是“表面”的意思。在SDK的文檔中,對Surface的描述是這樣的:“Handle onto a raw buffer that is being managed by the screen compositor”,翻譯成中文就是“由屏幕顯示內容合成器(screen compositor)所管理的原生緩沖器的句柄”,這句話包括下面兩個意思:
1. 通過Surface(因為Surface是句柄)就可以獲得原生緩沖器以及其中的內容。就像在C語言中,可以通過一個文件的句柄,就可以獲得文件的內容一樣;
2. 原生緩沖器(rawbuffer)是用於保存當前窗口的像素數據的。
引伸地,可以認為Android中的Surface就是一個用來畫圖形(graphics)或圖像(image)的地方。根據Java方面的常規知識,我們知道通常畫圖是在一個Canvas對象上面進行的,由此,可以推知一個Surface對象中應該包含有一個Canvas對象,事實上的確如此,而且這一點可以很容易通過debug運行程序的方式得到證明(將光標停留在對象變量surface上,會彈出一個對話框,其中紅色方框的內容,就表面surface中有一個CompatileCanvas成員變量)
3. Surface中有一個Canvas成員,專門用於畫圖的。
所以,Surface中的Canvas成員,是專門用於供程序員畫圖的場所,就像黑板一樣;其中的原生緩沖器是用來保存數據的地方;Surface本身的作用類似一個句柄,得到了這個句柄就可以得到其中的Canvas、原生緩沖器以及其它方面的內容。
二、Surfaceview
SurfaceView,顧名思義就是Surface的View,通過SurfaceView就可以看到Surface的部分或者全部的內容,也就是說,Surface是用通過SurfaceView才能展示其中的內容。從這個意思上來說,SurfaceView中的View之確切的含義應該是viewport即“視口”的意思,做過數據庫設計的朋友知道,假定一個數據表有20個字段,但我們常常只用到其中的5個字段,那麼就可以在原數據表的基礎上,通過SQL語句CREATEVIEW來創建只包含那5個字段內容的view。
另一方面,SurfaceView是Android中View的子類。事實上,在Android中所有用於界面展示的類皆為View的子類,包括那些不可見的、各種各樣的Layout。
所以說,SurfaceView中的View有兩個含義:
1. 視口(viewport)的意思
2. SurfaceView是View的派生類
在Android中Surface是從Object派生而來,且實現了Parcelable接口。看到Parcelable就讓人能很自然地想到數據容器,SurfaceView就是用來展示Surface中的數據的。在這個層面上而言,Surface就是管理數據的地方,SurfaceView就是展示數據的地方。
三、SurfaceHolder
SurfaceHolder是一個接口,其作用就像一個關於Surface的監聽器。提供訪問和控制SurfaceView背後的Surface 相關的方法 (providingaccess and control over this SurfaceView's underlying surface),它通過三個回調方法,讓我們可以感知到Surface的創建、銷毀或者改變。在SurfaceView中有一個方法getHolder,可以很方便地獲得SurfaceView所對應的Surface所對應的SurfaceHolder(有點拗口吧)。
除了下面我們要提的SurfaceHolder.callback之外其實還有很多其他的方法都很重要,各位可以去查查sdk的官方文檔,比如:
abstract void addCallback(SurfaceHolder.Callbackcallback)
abstract Canvas lockCanvas()
abstract Canvas lockCanvas(Rectdirty)
abstract void unlockCanvasAndPost(Canvascanvas)
從設計模式的高度來看,Surface、SurfaceView和SurfaceHolder實質上就是廣為人知的MVC,即Model-View-Controller。Model就是模型的意思,或者說是數據模型,或者更簡單地說就是數據,也就是這裡的Surface;View即視圖,代表用戶交互界面,也就是這裡的SurfaceView;SurfaceHolder很明顯可以理解為MVC中的Controller(控制器)。這樣看起來三者之間的關系就清楚了很多。
前面已經講到SurfaceHolder是一個接口,它通過回到方法的方式,讓我們可以感知到Surface的創建、銷毀或者改變。其實這一點是通過其內部的靜態子接口SurfaceHolder.Callback來實現的。SurfaceHolder.Callback中定義了三個接口方法: