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) {
// 处理可用的屏幕尺寸的改变
}
}
}

posted on 2012-02-24 11:43  一指流砂  阅读(3833)  评论(0编辑  收藏  举报

导航