Winscope重要干货知识点RelativeLayer相关的查看方式

20 阅读2分钟

背景:

通过之前学习马哥的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实战干货,请关注下面 ↓ "千里马学框架"