android view的绘制原理,SurfaceView 原理

本文详细解析了SurfaceView的工作原理,包括SurfaceView如何创建Surface、如何为父视图设置透明区域以及如何利用Surface进行绘制。通过源码分析,揭示了SurfaceView在Activity中内嵌时UI的绘制流程,以及Surface在Z轴上的分层机制。对于Android开发者来说,理解这些核心概念对于优化UI性能和进行多媒体应用开发至关重要。
摘要由CSDN通过智能技术生成

Preview

Q1: 啥是SurfaceView?

[一个自带surface 画布的view]

[能在子线程中做UI操作]

Q2:在Activity 中 内嵌 SurfaceView的情况下 , UI 是如何绘制的?

1)Activity 中ViewRoot 自带一个surface,我们叫它aSurface; SurfaceView 也自带一个surface,我们叫它mSurface。

2)UI 绘制在这个两个surface中进行,surface是按照Z 轴进行Layer 分层的,aSurface 的Z 轴值大于mSurface,所以它们的分层如图:mSurface 躲在aSurface的后面。

3)aSurface 躲在后面是如何显示的呢?SurfaceView 会对他的所有Parent 设置一个透明块,然后我们就看到了SurfaceView了。

67a0ff49295e4ef29490b5838a008523.png

Depth

了解SurfaceView 原理,我们需要回答三个核心问题

1)SurfaceView 是如何创建Surface的?

2)SurfaceView 是如何给Parent 设置透明区域的?

3)SurfaceView 是如何利用Surface来绘制的?

SurfaceView 是如何创建Surface的?

直接成员变量new 一个final对象出来

public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallback {

...

final Surface mSurface = new Surface(); // Current surface in use

...

}

复制代码

SurfaceView 是如何给Parent 设置透明区域的?

SurfaceView.onAttachedToWindow

@Override

protected void onAttachedToWindow() {

super.onAttachedToWindow();

...

mParent.requestTransparentRegion(SurfaceView.this);

...

}

复制代码

ViewRootImpl.dispatchWindwoVisibiltyChanged() 入口

然后回调到View的gatherTransparentRegion()设置透明区域

public boolean gatherTransparentRegion(Region region) {

...

if (mBackground != null && mBackground.getOpacity() != PixelFormat.TRANSPARENT) {

// The SKIP_DRAW flag IS set and the background drawable exists, we remove

// the background drawable's non-transparent parts from this transparent region.

applyDrawableToTransparentRegion(mBackground, region);

}

return true;

...

}复制代码

SurfaceView 是如何利用Surface来绘制的?

SurfaceFliger那一套

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值