Android关于SurfaceView,SurfaceHolder,SurfaceHolder.CallBack详解

官方的定义:html

1.SurfaceView编程

  SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你能够控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。
  surface是纵深排序(Z-ordered)的,这代表它总在本身所在窗口的后面。surfaceview提供了一个可见区域,只有在这个可见区域内 的surface部份内容才可见,可见区域外的部分不可见。surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者 surface的内容会被它的兄弟视图遮挡,这一特性能够用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,若是surface上面 有透明控件,那么它的每次变化都会引发框架从新计算它和顶层控件的透明效果,这会影响性能。
  你能够经过SurfaceHolder接口访问这个Surface.用getHolder()方法能够获得这个接口。
surfaceview变得可见时,surface被建立;surfaceview隐藏前,surface被销毁。这样能节省资源。若是你要查看 surface被建立和销毁的时机,能够重载surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。
surfaceview的核心在于提供了两个线程:UI线程和渲染线程。这里应注意:
1> 全部SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,通常来讲就是应用程序主线程。渲染线程所要访问的各类变量应该做同步处理。
2> 因为surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,因此要确保渲染线程访问的是合法有效的surface。框架

2.SurfaceHolder性能

  显示一个surface的抽象接口,使你能够控制surface的大小和格式, 以及在surface上编辑像素,和监视surace的改变。这个接口一般经过SurfaceView类实现。spa

3. SurfaceHolder.Callback线程

  用户能够实现此接口接收surface变化的消息。当用在一个SurfaceView 中时,  它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间有效。设置Callback的方法是SurfaceHolder.addCallback.code

  为何要实现Callback接口呢?由于使用SurfaceView有一个原则,全部的绘图工做必须得在Surface被建立以后才能开始(Surface---表面,这个概念在图形编程中经常被提到。基本上咱们能够吧它当作显存的一个映射,写入到Surface的内容能够被直接复制到显存从而显示出来,这使得显示速度回很是快),而在Surface被销毁以前必须结束。因此Callback中的surfaceCreated和surfaceDestroyed就成了绘图处理代码的边界。htm

  当surface被建立后,系统会自动调用surfaceCreated()方法,咱们一般会在该方法中对与surface相关的资源或对象进行初始化操做。对象

1 public void surfaceCreated(SurfaceHolder holder) {
2         if (!hasSurface) {
3             hasSurface = true;
4             initCamera(holder);
5         }
6     }

  当surface被销毁时,会调用surfaceDestroyed()方法:blog

1 public void surfaceDestroyed(SurfaceHolder holder) {
2    hasSurface = false;
3 }

  

参见:http://www.cnblogs.com/bausch/archive/2011/10/20/2219068.html

相关文章
相关标签/搜索