最近遇到了一个十分奇怪的问题,令我开始想要深入了解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的深入了解准备放到下次再说,先看看源码总结一下先。
问题描述:
相信很多开发者都喜欢使用自定义的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的深入了解准备放到下次再说,先看看源码总结一下先。