Android 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);
         }
     }
}

 相关阅读

SurfaceView开启相机预览

SurfaceView实现跟随手指移动的光标

posted @ 2018-08-15 15:56  YangBryant  阅读(1474)  评论(2编辑  收藏  举报