zoukankan      html  css  js  c++  java
  • Android 展示控件之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系

    一、Surface 

    Surface在SDK的文档中的描述是这样的:Handle onto a raw buffer that is being managed by the screen compositor,翻译成中文就是“由屏幕显示内容合成器(screen compositor)所管理的原生缓冲器的句柄”。这句话包括如下两个意思:

    1. 通过Surface(因为Surface是句柄)就可以获得原生缓冲器以及其中的内容。就像在C语言中,可以通过一个文件的句柄,就可以获得文件的内容一样;
    2. 原生缓冲器(rawbuffer)是用于保存当前窗口的像素数据的。

    也就是说Android中的Surface就是一个用来画图形(graphics)或图像(image)的地方。根据Java方面的常规知识,我们知道通常画图是在一个Canvas对象上面进行的,所以我们可以推测一个Surface对象中应该包含有一个Canvas对象,而事实也确实如此,通过查看Surface的源码可以证明:

    ***
    private final Canvas mCanvas = new CompatibleCanvas();
    ***

    Surface中的Canvas成员专门用于供程序员画图的场所,就像黑板一样;其中的原生缓冲器是用来保存数据的地方;Surface本身的作用类似一个句柄,得到了这个句柄就可以得到其中的Canvas、原生缓冲器以及其它方面的内容。

    每个Surface都是双缓冲,它有一个backBuffer和一个frontBuffer,Surface中创建了Canvas对象,用来管理Surface绘图操作,Canvas对应Bitmap,存储Surface中的内容。所以使用Surface进行绘制的流程为:

    1. 创建一个Bitmap对象。
    2. 创建一个Canvas对象关联创建的Bitmap对象。
    3. 在Canvas上进行绘制。
    4. 锁定Canvas画布。
    5. 将Bitmap内容绘制到backBuffer中去。
    6. 解锁Canvas画布。

    二、SurfaceView

    SurfaceView是视图类View的子类,且实现了Parcelable接口且实现了Parcelable接口,其中内嵌了一个专门用于绘制的Surface,SurfaceView可以控制这个Surface的格式和尺寸,以及Surface的绘制位置。可以理解为Surface就是管理数据的地方,SurfaceView就是展示数据的地方,而我们就是通过SurfaceView看到的Surface的部分或者全部内容,再换句话说就是Surface是用通过SurfaceView才能展示其中的内容,二者的关系图如下:

    SurfaceView和View最本质的区别在于:SurfaceView支持在单独线程中重新绘制画面,而View必须在UI的主线程中更新画面。

    三、SurfaceHolder

    SurfaceHolder是一个接口,其作用类似于一个surace的监听器,提供访问和控制Surface的方法。通过下面三个回调方法可以监听Surface的创建、销毁或者改变。

    SurfaceView中调用getHolder方法,可以获得当前SurfaceView中的surface对应的SurfaceHolder,SurfaceHolder中重要的方法有:

    1. abstract  void addCallback(SurfaceHolder.Callback callback ):为SurfaceHolder添加一个SurfaceHolder.Callback回调接口。
    2. abstract  Canvas lockCanvas() :获取Surface中的Canvas对象,并锁定之。所得到的Canvas对象,其实就是Surface中一个成员。
    3. abstract Canvas lockCanvas(Rect dirty):同上。但只锁定dirty所指定的矩形区域,因此效率更高。
    4. abstract  void unlockCanvasAndPost(Canvas canvas):当修改Surface中的数据完成后,释放同步锁,并提交改变,然后将新的数据进行展示。
    5.  public abstract void setType (int type):设置Surface的类型。

    从设计模式的角度来看,Surface、SurfaceView和SurfaceHolder实质上就是广为人知的MVC,即Model-View-Controller。Model就是模型的意思,或者说是数据模型,或者更简单地说就是数据,也就是这里的Surface;View即视图,代表用户交互界面,也就是这里的SurfaceView;SurfaceHolder很明显可以理解为MVC中的Controller(控制器)。这样再看三者之间的关系就清楚了很多。

    四、SurfaceHolder.Callback

    SurfaceHolder.Callback是SurfaceHolder接口内部的静态子接口,SurfaceHolder.Callback中定义了三个接口方法:

    • public void sufaceChanged(SurfaceHolder holder,int format,int width,int height){}:Surface的大小发生改变时调用。
    • public void surfaceCreated(SurfaceHolder holder){}:Surface创建时触发,一般在这里调用画面的线程。
    • public void surfaceDestroyed(SurfaceHolder holder){}:销毁时触发,一般在这里将画面的线程停止、释放。

    注意:所有SurfaceView和SurfaceHolder.Callback中声明的方法,必须在运行SurfaceView窗口中的线程中调用(即UI线程),因为它们需要正确地将同时被绘制线程访问的各种状态进行同步。 

  • 相关阅读:
    java 在线网络考试系统源码 springboot mybaits vue.js 前后分离跨域
    springboot 整合flowable 项目源码 mybiats vue.js 前后分离 跨域
    flowable Springboot vue.js 前后分离 跨域 有代码生成器 工作流
    Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    java 企业 网站源码 后台 springmvc SSM 前台 静态化 代码生成器
    java 进销存 商户管理 系统 管理 库存管理 销售报表springmvc SSM项目
    基于FPGA的电子计算器设计(中)
    基于FPGA的电子计算器设计(上)
    FPGA零基础学习:SPI 协议驱动设计
    Signal tap 逻辑分析仪使用教程
  • 原文地址:https://www.cnblogs.com/renhui/p/9273165.html
Copyright © 2011-2022 走看看