下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

详解android开发下的Surface系统

作者:课课家教育     来源: http://www.kokojia.com点击数:1642发布时间: 2016-06-07 08:00:24

标签: androidandroid Surfaceandroid开发

   Surface对应了一块屏幕缓冲区,每个window对应一个Surface,任何View都是画在Surface上的,传统的view共享一块屏幕缓冲区,所有的绘制必须在UI线程中进行。SurfaceView是一个View也许不够严谨,然而从定义中 public class SurfaceView extends View {...}显示SurfaceView确实是派生自View,但是SurfaceView却有着自己的Surface。

详解android开发下的Surface系统_android_android Surface_android开发_课课家

  java层次的Surface系统

  1. 过程描述

  Android.view.Surfaceview类继承自android.view.View类,在view层次关系上提供精细绘制Surface的方法,可以通过它来改变Surface的格式、大小等。

  android.view.SurfaceHolder为SurfaceView提供的一个接口类。方便实现对Surface的控制。

  android.view.Surface raw buffer的句柄,被screen compositor管理。

  当SurfaceView窗口可见的时候,会创建一个Surface对象。此时继承自SurfaceView的子类(继承了一个父类:SurfaceView实现一个接口:SurfaceHolder.Callback)需要重载android.view.SurfaceHolder.Callback(接口)提供的虚函数surfaceCreated(SurfaceHolder)。同样销毁的时候需要实现surfaceDestroyed(SurfaceHolder)虚函数。

  整个过程如下:

  (1)子类(继承自SurfaceView和SurfaceHolder.Callback)获取SurfaceHolder(也是一个接口,SurfaceView以内部类的形式对其进行了实现)

  (2)将this指针添加到SurfaceHolder回调(SurfaceHolder.addCallback())中。

  (3)父类SurfaceView负责UpdateWindow并调用相应的回调函数(子类中的SurfaceHolder.Callback中的相应的接口实现)

  (4)子类中通过对虚函数重载,实现将内容画到Surface上。

  2.Java Surface与Activity之间的关系

  通过Activity提供的setContentView等方法将SurfaceView添加到主界面中。android.view.Surface是SurfaceView的一个成员变量

  3. Surface是什么

  从android.view.Surface中追踪:

  public Surface(SurfaceSession s, int pid, int display, int w, int h, int format, int flags)

  throws OutOfResourcesException {

  mCanvas = new CompatibleCanvas();

  init(s,pid,display,w,h,format,flags);

  }

  public Surface() { mCanvas = new CompatibleCanvas(); }

  从Surface的构造函数中可以看出,在其中主要是new了一个Canvas,也就是一个画布,由此我们不难猜测,这块画布对应于Surface的创建过程。所以Surface的本质就是一块内存区。注意CompatibleCanvas是Surface的一个内部类。

  4. Surface的JNI接口

  android.view.surface的实例化了一个mCanvas对象,其中通过多个JNI接口和其下层的本地化语言进行通信。主要的接口包括:

  

   

 

 

 

 

  本质上,Surface就是一块内存区,本文通过了四个方面来介绍Surface,从过程描述,到Java Surface与Activity之间的关系介绍到SurfaceJNI接口来详解Surface。

赞(28)
踩(4)
分享到:
华为认证网络工程师 HCIE直播课视频教程