关于Drawable共用问题的初步探索

最近遇到了一个十分奇怪的问题,令我开始想要深入了解Drawable的原理。


        问题描述:


        相信很多开发者都喜欢使用自定义的TitleBar组件,而不是用系统自带的ActionBar或者AppBar。我遇到的问题,就是跟TitleBar的Drawable相关。


        1、正常情况下是这样的




        2、因为产品需求,需要将返回按钮变为灰色,按钮的图标也变为灰色,如下:




        3、这个时候如果进入到其它页面,会惊讶都发现,显示不正常,如下:


 
        4、有时候返回原来的页面时,还会变成这样:




        


         文字和图标的颜色对不上。以上情况大部分国内手机都会,像HTC就不会。


        经过调试之后,“编辑头像”那个页面的按钮变灰,是因为“我的信息”中调用了设置为灰色的代码(drawableLeft.setColorFilter(0xbbbbbb,PorterDuff.Mode.SRC_IN);)


        反复修改都没有结果,最后想,会不会是因为是Drawable在内存中是共用的,不同的引用做了修改之后,其它Drawable也会发生相应的变化呢?


        于是写了个例子测试一下


       1、这个例子的界面是这样的:




       2、XML代码如下:




        3、接着编写Activity的代码,如下:




        以上代码的意思是,当Activity被触摸产生ACTION_UP事件时,更改左边TextView的CompoundDrawable的颜色,同时让右边的TextView重绘。


        注意,这里并没有更改右边TextView的Drawable,只是让它重绘。


         4、最后运行的效果如下:




        上面的效果图表明,当左边的Drawable发生变化的时候,右边的Drawable也发生变化了,甚至连标题栏也发生了变化


       总结一下:对于引用同一个资源ID的不同Drawable,当其中一个发生了变化,其它Drawable也会跟着发生变化。


        其实,这也可以证明引用同一个资源ID的不同Drawable,在内存中是共用一个Bitmap的。


       这就解释了最近遇到的问题了


       关于Drawable的深入了解准备放到下次再说,先看看源码总结一下先。

你可能感兴趣的:(关于Drawable共用问题的初步探索)