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中一个成员。


发布评论