SurfaceView Surface相當於繪製的容器,所有View和子類都是繪製在這裡面。 SurfaceView是View的子類,將Surface的數據顯示出來。 View適用主動更新視圖,不需要頻繁刷新。在主線程更新UI,沒有雙緩衝機制。 SurfaceView適用於被動更新視圖,頻繁刷新。通 ...
SurfaceView
Surface相當於繪製的容器,所有View和子類都是繪製在這裡面。
SurfaceView是View的子類,將Surface的數據顯示出來。
View適用主動更新視圖,不需要頻繁刷新。在主線程更新UI,沒有雙緩衝機制。
SurfaceView適用於被動更新視圖,頻繁刷新。通過子線程更新UI,底層實現中就實現了雙緩衝機制。
SurfaceHolder
SurfaceHolder是Surface的抽象介面,操縱surface的控制器。
使用SurfaceView的getHolder()方法,獲取SurfaceHolder對象
在SurfaceView使用中需要的幾個重要方法:
void addCallback(SurfaceHolder.Callback var1); //為SurfaceHolder添加一個SurfaceHolder.Callback回調介面 void removeCallback(SurfaceHolder.Callback var1); //從Surface持有者中刪除回調介面 Canvas lockCanvas(); //獲取Canvas對象,並鎖定 void unlockCanvasAndPost(Canvas var1); //釋放同步鎖,並顯示 void setFormat(int var1); //指定surface的像素格式,PixelFormat常量 void setFixedSize(int var1, int var2); //固定Surface的寬高 void setKeepScreenOn(boolean var1); //false是允許屏幕關閉,true強制屏幕打開狀態
SurfaceHolder.Callback
實現SurfaceHolder.Callback介面,創建SurfaceView的生命周期,它有三個回調方法:
@Override public void surfaceCreated(SurfaceHolder holder) { //Surface創建的時候調用 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { //Surface大小被改變的時候調用 } @Override public void surfaceDestroyed(SurfaceHolder holder) { //Surface被銷毀的時候調用 }
實現Runnable介面,利用子線程做繪圖操作
繪製方法需要在繪製前調用locakCanvas鎖定畫布,得到畫布。
繪製完成後需要調用lockCanvasAndPost方法來解鎖畫布,顯示。
@Override public void run() { draw(); } private void draw() { try { mCanvas=mHolder.lockCanvas(); //繪製 }catch (Exception e){ }finally { //避免黑屏情況,解鎖畫布 if(mCanvas!=null){ mHolder.unlockCanvasAndPost(mCanvas); } } }