欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android SurfaceView

程序员文章站 2022-08-08 10:14:03
SurfaceView Surface相当于绘制的容器,所有View和子类都是绘制在这里面。 SurfaceView是View的子类,将Surface的数据显示出来。 View适用主动更新视图,不需要频繁刷新。在主线程更新UI,没有双缓冲机制。 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实现跟随手指移动的光标