要创建一个新的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() { ( mySurfaceViewThread == null) { mySurfaceViewThread = new MySurfaceViewThread(); if ( hasSurface == true) mySurfaceViewThread.start(); } } public void pause() { (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 ; (!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) { // 处理可用的屏幕尺寸的改变 } } }