理解Surface,SurfaceView,SurfaceHolder,SurfaceHolder.CallBack

来源:互联网 发布:网络直播平台监管 编辑:程序博客网 时间:2024/05/16 06:53

原文链接:http://blog.csdn.net/pathuang68/article/details/7351317

一、Surface

1.      通过Surface就可以获得原生缓冲器以及其中的内容。

2.      原生缓冲器(rawbuffer)是用于保存当前窗口的像素数据的。

引伸地,可以认为Android中的Surface就是一个用来画图形(graphics)或图像(image)的地方。根据Java方面的常规知识,我们知道通常画图是在一个Canvas对象上面进行的,由此,可以推知一个Surface对象中应该包含有一个Canvas对象,事实上的确如此。

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(有点拗口吧)。

 

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

       abstract voidaddCallback(SurfaceHolder.Callbackcallback)

为SurfaceHolder添加一个SurfaceHolder.Callback回调接口。

 

四、SurfaceHolder.Callback

前面已经讲到SurfaceHolder是一个接口,它通过回到方法的方式,让我们可以感知到Surface的创建、销毁或者改变。其实这一点是通过其内部的静态子接口SurfaceHolder.Callback来实现的。SurfaceHolder.Callback中定义了三个接口方法:

1.     abstract voidsurfaceChanged(SurfaceHolderholder holder, int format, int width, int height)

当surface发生任何结构性的变化时(格式或者大小),该方法就会被立即调用。

 

在surfaceCreated调用后该函数至少会被调用一次。

                参数

              holder       更新surface的SurfaceHolder

              format       新的图形格式

              width         新的宽度

              height      新的高度

 

 

2.      abstract voidsurfaceCreated(SurfaceHolderholder holder)

当surface对象创建后,该方法就会被立即调用。

程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制Surface。

3.      abstract voidsurfaceDestroyed(SurfaceHolderholder holder)

当surface对象在将要销毁前,该方法会被立即调用。该函数被调用后就不能继续使用Surface了,一般在该函数中来清理使用的资源。

 

 

0 0
原创粉丝点击