【学习笔记】关于Android的Surface系统

本文深入解析了Android中Java层次的Surface系统,详细介绍了SurfaceView及其与Surface的关系,以及如何通过SurfaceView实现对Surface的控制。此外,还探讨了Surface的本质及创建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的一个内部类。


在调用Surface时,调用createSurface()函数,创建各个层之后,分别调用不同层中的getSurface()接口来得到一个ISurface类型的实例,然后在SurfaceComposerClient::createSurface()中得到Surface,并将其返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值