最近项目出现一个比较奇怪的现象:概率性的,整个应用的黑色,都变成了半透明的(看上去有点像灰色)。
后来才发现,是有必现路径的,有个地方用了.getBackground().setAlpha(50),导致应用的#FF000000黑色Drawable被改了,但是其他地方在使用这个背景色的时候,会共享被改了的这个Drawable,所以变成整个应用,不透明的黑色,全部变成透明度为50的黑色。
源代码
通过网上资料了解,确实如此,我们可以通过上图中的方法知道:
默认情况下,任何地方加载同一个资源的时候都会使用同一个实例,所以在某一个地方修改了这个实例,那其他地方使用的时候,也是被修改的。
那mutate方法可以将这个drawable实例标记为可变的,这样标记下,我们可以根据需求对这个实例就行修改,还可以保证他不会被其他地方共享使用。
xxx.getBackground().mutate().setAlpha(50);
通过这样使用确实解决了问题,没碰到这个问题,都还没发现这个共享机制,再次记录下。
另外,我发现出现问题的地方,其实就是要设置一个带有透明度的黑色背景而已,直接设置#33000000颜色的背景就可以了,这样还可以共享drawble。肯定比先设置一个#000000背景,然后通过setAlpha方法去改透明度来得好,所以建议不需要动态变化的色值,可以直接设置。
这个问题最后解决方式:删掉之前代码.getBackground().setAlpha(50);
然后在布局文件中设置背景色--android:background="#33000000"
网友评论