SurfaceView 典型用法


要創建一個新的SurfaceView,需要創建一個新的擴展了SurfaceView的類,並實現SurfaceHolder.Callback。

SurfaceHolder回調可以在底層的Surface被創建和銷毀的時候通知View,並傳遞給它對SurfaceHolder對象的引用,其中包含了當前有效的Surface。

一個典型的Surface View設計模型包括一個由Thread所派生的類,它可以接收對當前的SurfaceHolder的引用,並獨立地更新它。

下面的框架代碼展示了使用Canvas所繪制的Surface View的實現。在Surface View控件中創建了一個新的由Thread派生的類,並且所有的UI更新都是在這個新類中處理的。

import android.content.Context;  
import android.graphics.Canvas;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MySurfaceView extends SurfaceView implements SurfaceHolder. Callback {

private SurfaceHolder holder;
private MySurfaceViewThread mySurfaceViewThread;
private boolean hasSurface;

MySurfaceView(Context context) {
super(context);
init();
}

private void init() {
//創建一個新的SurfaceHolder, 並分配這個類作為它的回調(callback)
holder = getHolder ();
holder.addCallback(this);
hasSurface = false ;
}

public void resume() {
//創建和啟動圖像更新線程
if ( mySurfaceViewThread == null) {
mySurfaceViewThread = new MySurfaceViewThread();
if ( hasSurface == true)
mySurfaceViewThread.start();
}
}

public void pause() {
// 殺死圖像更新線程
if (mySurfaceViewThread != null) {
mySurfaceViewThread.requestExitAndWait();
mySurfaceViewThread = null ;
}
}

public void surfaceCreated(SurfaceHolder holder) {
hasSurface = true ;
if (mySurfaceViewThread != null)
mySurfaceViewThread.start();
}

public void surfaceDestroyed(SurfaceHolder holder) {
hasSurface = false ;
pause();
}

public void surfaceChanged(SurfaceHolder holder,int format,int w,int h) {
if (mySurfaceViewThread != null)
mySurfaceViewThread.onWindowResize(w, h);
}

class MySurfaceViewThread extends Thread {
private boolean done;

MySurfaceViewThread() {
super();
done = false ;
}

@Override
public void run() {
SurfaceHolder surfaceHolder = holder ;

// 重復繪圖循環,直到線程停止
while (!done) {
// 鎖定surface,並返回到要繪圖的Canvas
Canvas canvas = surfaceHolder .lockCanvas();

// 待實現:在Canvas上繪圖

// 解鎖Canvas,並渲染當前圖像
surfaceHolder.unlockCanvasAndPost(canvas);
}
}

public void requestExitAndWait() {
// 把這個線程標記為完成,並合並到主程序線程
done = true ;
try {
join();
} catch (InterruptedException ex) { }
}

public void onWindowResize(int w, int h) {
// 處理可用的屏幕尺寸的改變
}
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM