SurfaceView的工作原理

SurfaceView在Android中作为独立的绘图表面,常用于游戏和视频播放。它不在主线程绘制,避免阻塞UI。SurfaceView窗口类型默认为TYPE_APPLICATION_MEDIA,可调整以适应不同需求。当SurfaceView附加到窗口时,会在宿主窗口上挖洞并设置透明区域,以便在SurfaceView上方显示其他内容。SurfaceFlinger和WMS协同处理SurfaceView的透明区域和绘图表面的管理。
摘要由CSDN通过智能技术生成

大家在做android游戏和视频播放器的apk开发时,会经常用到SurfaceView这个类,以及它的子类VideoView,GLSurfaceView等.它与普通的View视图有本质的区别,本文就对SurfaceView的工作原理做个详细介绍(阅读本文之前,你需要对view的绘制流程,WMS,SurfaceFlinger的工作原理有一定了解).

SurfaceView不与它的宿主窗口共享同一个绘图表面,它拥有自己独立的绘图表面,也就是说拥有独立的Surface本地窗口,它可以在一个独立的子线程中进行绘制,这样它的绘制操作就不会阻塞主线程,当然它也可以在主线程中进行绘制,而其它的普通ui控件都是在应用程序的主线程中进行绘制的。

SurfaceView类的成员变量mWindowType描述的是SurfaceView的窗口类型,它的默认值等于TYPE_APPLICATION_MEDIA。也就是说,我们在创建一个SurfaceView的时候,默认是用来显示多媒体的,例如,用来显示视频。SurfaceView还有另外一个窗口类型TYPE_APPLICATION_MEDIA_OVERLAY,它是用来在视频上面显示一个Overlay的,这个Overlay可以用来显示视字幕等信息。

我们在创建了一个SurfaceView之后,可以调用它的成员函数setZOrderMediaOverlaysetZOrderOnTop或者setWindowType来修改该SurfaceView的窗口类型,也就是修改该SurfaceView的成员变量mWindowType的值。SurfaceView一般都是位于它对应的宿主窗口之下,也就是对应的layerzorder值更小,这样便于在SurfaceView的上面显示其它ui和字幕等信息,由于SurfaceView在其宿主窗口下面,这就要求必须在其宿主窗口界面上“挖洞”来显示SurfaceView内容,挖洞的实质就是在宿主窗口界面中对应显示SurfaceView的那块区域位置设置为透明区域。设置透明区域的代码调用流程为:

ViewRootImpl::performTraversals()->DecorView::dispatchAttachedToWindow()->View::dispatchAttachedToWindow()->SurfaceView::onAttachedToWindow()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值