今天的问题比较细了,探索一个大家可能没关注过的 API,View中包含一个方法:
- hasOverlappingRendering()
问题很直接:
- 这个方法有什么用?
- 在什么情况下我们会考虑复写这个方法?
更多问答 >>
-
2021-03-18 23:20
-
每日一问 | 在做性能优化的时候,常常看到 Thread(Cpu) Time,Wall clock Time?
2021-03-15 00:43 -
每日一问 | onDraw 里面调用 invalidate 做动画,有什么问题?
2021-04-13 00:31 -
每日一问 | mipmap vs drawable,傻傻分不清楚?
2021-03-30 21:14 -
2021-04-08 00:25
-
每日一问 | 类要先加载、链接、初始化才能实例化,有特殊Case吗?
2021-02-21 20:15 -
2021-01-31 16:58
-
每日一问 | Android 中两种设置线程优先级的方式,有何区别?
2021-01-27 23:59 -
每日一问 | Java 中的 lambda 与 Android 中的 lambda 有什么不同?
2021-01-31 17:20 -
每日一问 | Java中匿名内部类写成 lambda,真的只是语法糖吗?
2021-01-11 00:00
之前还真没有留意过这个。
这个方法有什么用呢?从文档注释上来看,是与设置了透明度的View的绘制性能有关,主要是用来告诉RenderNode,接下来会不会draw一些重叠的元素,如果这个方法返回false(默认为true),则会做一些针对性的优化,理论上是可以提高绘制效率的。emmmm,具体是什么样的效果呢?写个demo来测试下就知道了:先弄个自定义的View,并在里面draw两个重叠2/3区域的矩形,分别是蓝色和绿色:然后在布局里给它设置50%的alpha:
运行看下:
嗯,因为绿色矩形是在蓝色矩形之后draw的,覆盖在上面,很正常。
那现在重写hasOverlappingRendering
方法,并返回false:运行:
咦?怎么看上去好像多了一个颜色?
其实是相交部分颜色叠加之后的效果,因为hasOverlappingRendering
方法返回了false,RenderNode就不会对【设置了透明度的View】做特殊处理,也就是每个元素在绘制的时候都直接应用了50%的透明度,看上去就像两块带颜色的半透明的玻璃重叠一部分的效果。如果hasOverlappingRendering
返回true,在绘制时会先把它们正常draw到另外一个地方(offscreen buffer),然后作为一个整体去应用透明度再显示,这样就能保证重叠部分的效果不会发生变化。不过这样做明显步骤更多了,也就表示效率会比返回false
更低。我们应该在什么时候重写这个方法呢?
官方建议在一些应用了alpha的View,如果能确保绘制的内容没有重叠,就可以重写这个方法并返回false,理论上会提高绘制效率。emmmm,真的能提高效率吗?能提高多少呢?
这里做了个测试:Draw 4个重叠的矩形测试结果如下:
hasOverlappingRendering
Draw 40个重叠的矩形测试结果如下:
hasOverlappingRendering
可以看到,在开启硬件加速时,
所以我觉得,这个方法,可以直接忽略了,根本不需要重写(也有可能是高版本的系统对这个有优化,我两台测试机一台11一台9,没有对低版本系统测试过),弄不好还会出现一些意料之外的效果。hasOverlappingRendering
方法返回值对绘制速度的影响是微乎其微的,相差不超过0.02毫秒!!!要过年啦~ 祝大家身体健康,万事如意!
小缘,新年快乐~
鸿神新年快乐~
height / 2F - height / 4F,这里着实骚到我了哈哈
你是个狠人