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

 在进入正题以前,先回顾一下以前写的文章《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、这个例子的界面是这样的:

       2XML代码以下:

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

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

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

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

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

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

        其实,这也能够证实引用同一个资源ID的不一样Drawable在内存中是共用一个Bitmap

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

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

 

 

http://blog.sina.com.cn/s/blog_5de73d0b0102xbak.html

相关文章
相关标签/搜索