程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Surface,SurfaceView,SurfaceHolder及SurfaceHolder.Callback的關系

Surface,SurfaceView,SurfaceHolder及SurfaceHolder.Callback的關系

編輯:C++入門知識

一、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.callback

前面已經講到SurfaceHolder是一個接口,它通過回到方法的方式,讓我們可以感知到Surface的創建、銷毀或者改變。其實這一點是通過其內部的靜態子接口SurfaceHolder.Callback來實現的。SurfaceHolder.Callback中定義了三個接口方法:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved