編輯:高級開發
作者:Legend
QQ:158067568
之前我講解了Surface的繪圖原理概述,對於程序員,怎麼使用可能是眼下至關重要的事情。本節講解SurfaceView的使用。但在此之前我想先簡單概述一下SurfaceVIEw的特點。
為什麼選擇SurfaceVIEw
眾所周知,SurfaceView繼承自View,但它與View不同?View是在UI的主線程中更新畫面,而SurfaceVIEw是在一個新線程中更新畫面。我們不可能寫一個方法讓主線程自己運動。VIEw的特性決定了其不適合做動畫,因為如果更新畫面時間過長,那麼主UI線程就會被正在畫的函數阻塞。所以android中通常用SurfaceVIEw顯示動畫效果。
在對SurfaceVIEw進行操作前android為我們提供了一個十分好用的接口:SurfaceHolder.Callback接口。該接口中有三個抽象方法,這三個抽象方法是SurfaceVIEw的三個生命周期:
Java代碼
abstract void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
This is called immediately after any structural changes (format or size) have been made to the surface.
abstract void surfaceCreated(SurfaceHolder holder)
This is called immediately after the surface is first created.
abstract void surfaceDestroyed(SurfaceHolder holder)
This is called immediately before a surface is being destroyed.
abstract void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
This is called immediately after any structural changes (format or size) have been made to the surface.
abstract void surfaceCreated(SurfaceHolder holder)
This is called immediately after the surface is first created.
abstract void surfaceDestroyed(SurfaceHolder holder)
This is called immediately before a surface is being destroyed.
以上是從Api中我直接copy出來的,相信如果熟悉Activity的朋友我就不用過多進行解釋了(當然,如果不熟悉Acitvity,還是去看看吧)。
控制SurfaceVIEw的SurfaceHolder
上一節的Surface概述中我曾經說過每一個Surface都有一個Canvas,而Surface自身控制自己的大小等等屬性。但是Surface是如何控制自己的呢?
接上頁
在SurfaceVIEw中一般通過使用SurfaceHolder類來控制Canvas在其surface上的操作。
得到SurfaceHolder
如何得到SurfaceHolder?其實很簡單,在SurfaceView中提供了getHolder()方法。如果該surfaceVIEw中還需要實現回調生命周期,那麼holder還需要調用addCallback()方法為其添加回調聲明周期。API如下:
Java代碼
abstract void addCallback(SurfaceHolder.Callback callback)
Add a Callback interface for this holder.
abstract void addCallback(SurfaceHolder.Callback callback)
Add a Callback interface for this holder.
SurfaceHolder中還有幾個十分重要的方法:
lockCanvas():該方法用於鎖定畫布,這樣Surface中就可以指定back buffer中的畫布是那一塊了。之後就可以在畫布上進行繪畫,該方法的API如下,
Java代碼
abstract Canvas lockCanvas()
Start editing the pixels in the surface.
abstract Canvas lockCanvas()
Start editing the pixels in the surface.
lockCanvas()方法是對整個Surface進行重繪,但是很多情況下,我們只需要對Surface的一小部分進行重畫時,則使用lockCanvas(Rect dirty)更為明智。
lockCanvas(Rect dirty)通過其中的參數也可以看出,其只更新Rect部分的畫面。API入下:
Java代碼
abstract Canvas lockCanvas(Rect dirty)
Just like lockCanvas() but allows to specify a dirty rectangle.
abstract Canvas lockCanvas(Rect dirty)
Just like lockCanvas() but allows to specify a dirty rectangle.
以上兩個方法是對Canvas進行鎖定,當Canvas繪制完畢之後,Surface的front buffer就需要這個Surface進行顯示。如果此時Canvas還在鎖定狀態,則Surface的front buffer將不能得到Canvas。所以此時應該在canvas繪畫完畢之後,釋放鎖定。
unlockCanvasAndPost(Canvas canvas):用於釋放出於鎖定狀態的Canvas。API如下:
Java代碼
abstract void unlockCanvasAndPost(Canvas canvas)
Finish editing pixels in the surface.
abstract void unlockCanvasAndPost(Canvas canvas)
Finish editing pixels in the surface.
紙上談來終覺淺,下一節我將通過一個模擬小球跳躍的例子來講解SurfaceVIEw的用法。
://android.git.kernel.org/ 下紛繁復雜的文件 認識Android源代碼結構之前,先來再熟悉一下android的系統架構吧!android
通過與全球各地的手機制造商和移動運營商結成合作伙伴,開發既有用又有吸引力的移動服務,並推廣這個android開發平台,這也大大的加大了android開發平台在整個行業的
Google已經發布了android SDK 2.3版本,大家應該都在等android 2.3的升級吧?在51CTO獨家公布了android SDK 2.3下載地址後.
很多人對android2.0已經十分期待了,鑒於強大的功能性以及快速。android未來的市場將是十分廣闊的。搭載Android2.0源碼的摩托羅拉Droid手機已經上