背景:
通过之前学习马哥的wms专题中的winscope详细分析,在经常使用winscope查看某些层级顺序时候,经常查看的方式如下图所示:

这里可以看到正常NavigationBar0图层显示在最顶部部分,对应的图层层级肯定也最高。
正常情况下确实是按照上面的方式去查看的,但是也会有对应的另外特殊情况,比如SurfaceView情况,明显看着是SurfaceView的这些图层图层应该是比Activity的要高,而且从画面画面也可以看出来确实是这样:

那么实际真的是SurfaceView在Activity上面么?
dumpsys SurfaceFlinger查看验证
dumpsys SurfaceFlinger后查看如下
实际查看明显发现SurfaceView位于Activity图层下面,和上面winscope的看着是有冲突的,那么这个到底是winscope不准确有问题,还是我们有啥知识点遗漏呢?
其实当然是我们对winscope的观看知识点有遗漏,简单说就是修为还不够哈,那么针对SurfaceView这种一个怎么看呢?
RelativeLayer方式设置图层相对位置
这里winscope明显可以看到SurfaceView图层上相比其他图层还有一写标识上的差异,多了一些RelZ,和RelZParent这样的标识。

那么针对这个有特别的RelZ系列标识的应该怎么看呢?
可以看到这里的 Background for SurfaceView图层其实有relative parent:652
这里的652就是新的parent的id
得出结论就是Background for SurfaceView图层其实有新的parent为652.

可以看到这652就是Activity图层,而且还有一个z-order: -2147483648
这里明显看到z-order是一个极小值,也就可以认为 Background for SurfaceView位于Activity图层级别的最下面。
同时注意Activity图层上也有一个标识RelZParent

即代表Activity图层是作为了某一个图层RelativeLayer的父亲。这个部分就是相当于图层顺序的核心哈,其实winscope就已经有针对这个相对图层有明显的标识。
那么这里也可以可以理解为啥
Background for SurfaceView其实是位于Activity图层的下面。
正常的其他没有设置相对图层的这部分显示是个none

比如状态栏只有个绝对图层,他的相对图层就是none。
对应的代码:
相对图层设置其实也是通过上层接口设置的:

大家如果不清楚到底哪里设置的这个RelativeLayer,可以去这里打堆栈哈。
SurfaceView设置的这个RelativeLayer其实是如下代码:

更多framework实战干货,请关注下面 ↓ “千里马学框架”
245

被折叠的 条评论
为什么被折叠?



