2024年3月30日发(作者:)

Surface、SurfaceView、SurfaceHolder及

ck之间的关系

一、Surface

Surface就是“表面”的意思。在SDK的文档中,对Surface的描述是这样 的:“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对象,事实上的确如此,而且这一点可以很容易通过debug运行程序的方式得到证明(将

光标停留在对象 变量surface上,会弹出一个对话框,其中红色方框的内容,就表面surface中有一个

CompatileCanvas成员变量)当然,看源代码也 是可以证明这一点:

因此,在前面提及的两个意思的基础上,可以再加上一条:

3. Surface中有一个Canvas成员,专门用于画图的。

所以,Surface中的Canvas成员,是专门用于供程序员画图的场所,就像黑板一样;其中的原生缓冲器是用来保

存数据的地方;Surface本身的作用类似一个句柄,得到了这个句柄就可以得到其中的Canvas、原生缓冲器以及

其它方面的内容。

二、SurfaceView

SurfaceView,顾名思义就是Surface的View,通过SurfaceView就可以看到Surface的部分或者全部的内容,

下面用一个图来形象地描述一下Surface和SurfaceView的关系:

也就是说,Surface是用通过SurfaceView才能展示其中的内容。从这个 意思上来说,SurfaceView中的View

之确切的含义应该是viewport即“视口”的意思,做过数据库设计的朋友知道,假定一个数据表有20 个字段,

但我们常常只用到其中的5个字段,那么就可以在原数据表的基础上,通过SQL语句CREATEVIEW来创建只包含

那5个字段内容的view。

另一方面,SurfaceView是Android中View的子类。事实上,在Android中所有用于界面展示的类皆为View的

子类,包括那些不可见的、各种各样的Layout。

所以说,SurfaceView中的View有两个含义:

1. 视口(viewport)的意思

2. SurfaceView是View的派生类

在Android中Surface是从Object派生而来,且实现了Parcelable 接口。看到Parcelable就让人能很自然地想到数

据容器,SurfaceView就是用来展示Surface中的数据的。在这个层面上而 言,Surface就是管理数据的地方,

SurfaceView就是展示数据的地方。

三、SurfaceHolder

SurfaceHolder是一个接口,其作用就像一个关于Surface的监听器。 提供访问和控制SurfaceView背后的

Surface 相关的方法 (providingaccess and control over this SurfaceView's underlying surface),它

通过三个回调方法,让我们可以感知到Surface的创建、销毁或者改变。在SurfaceView中有一个方法 getHolder,

可以很方便地获得SurfaceView所对应的Surface所对应的SurfaceHolder(有点拗口吧)。

除下面将要提到的ck外,SurfaceHolder还提供了很多重要的方法,其中最重要的就是:

1. abstract void addCallback(ckcallback)

为SurfaceHolder添加一个ck回调接口。

2. abstract Canvas lockCanvas()

获取一个Canvas对象,并锁定之。所得到的Canvas对象,其实就是Surface中一个成员。