在支持它的设备上禁用硬件加速时的工件

时间:2014-08-12 16:00:48

标签: android android-layout

我正在编写一个具有相当复杂的UI的应用程序,该UI的一部分是可以在屏幕上移动(或远离屏幕)的特定视图。 为此,我实现了自定义布局管理器,最初将该面板定位在屏幕外,并在某些TouchEvent发生时将其移动到屏幕上。 所以基本上我正在使用触摸处理程序调用.layout来移动视图。 该特定视图确实有背景,底层视图没有,活动背景在主题中设置。

在老式机器人(如2.1)和现代机器人(如4.3)上通过硬件加速完美运行,但在现代机器人上运行且h / w加速禁用时显示出意想不到的效果。

在这种情况下,只要可移动视图的屏幕上部分保持不变,一切都很好。 一旦我开始调整该视图的大小或将其移出屏幕,它就会开始留下文物。这基本上看起来不再为脏区域擦除背景,绘制所有底层视图,但是在我刚搬走的部分视图的脏背景上。

在可移动视图的.layout之后从底层视图中转储标记显示,我设置了广告D标志,因此无论如何都应该重新绘制它们,但是使用适当的rect手动调用那些区域上的.invalidate可以修复问题(但是出于多种原因,这是一个糟糕的解决方案。)

我做错了什么?

1 个答案:

答案 0 :(得分:0)

问题出在ViewGroup.invalidateChild函数中,因为如果视图不透明且没有动画,它不会使背景失效。 使移动视图的背景有点变化(边框描边颜色上的FE alpha)可以解决上述问题并且对性能没有明显影响。