在进入正题以前,先回顾一下以前写的文章《Android内存优化测试(原创)》,html
文章中有提到,尽可能使用Drawable而非Bitmap来存放图片资源,由于Drawable占用的内存更小,能够在必定程度上避免OOM错误。测试
最近遇到了一个十分奇怪的问题,令我开始想要深刻了解Drawable的原理。优化
问题描述:url
相信不少开发者都喜欢使用自定义的TitleBar组件,而不是用系统自带的ActionBar或者AppBar。我遇到的问题,就是跟TitleBar的Drawable相关。3d
一、正常状况下是这样的调试
二、由于产品需求,须要将返回按钮变为灰色,按钮的图标也变为灰色,以下:htm
三、这个时候若是进入到其它页面,会惊讶都发现,显示不正常,以下:blog
四、有时候返回原来的页面时,还会变成这样:事件
文字和图标的颜色对不上。以上状况大部分国内手机都会,像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的深刻了解准备放到下次再说,先看看源码总结一下先。