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) {  
      // 处理可用的屏幕尺寸的改变  
    }  
  }  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值