题外话
今天看到一篇文章,提到美国现总统唐纳德·特朗普和前总统贝拉克·侯赛因·奥巴马在任职期间对中国的影响,提到特朗普政府对中国是烫水煮青蛙,而奥巴马政府是温水煮青蛙。烫水虽然暂时是痛苦的,但能让我们立马清醒过来。美国政府自然是为美国人民考虑的。郑强教授也提到过,中国是个神奇的国家,越是对其搞封锁,反倒是越能干出花样来。
前言
本篇主要记录在开发过程中由于部分基础不扎实导致的一些“加班”情况(浪费了太多时间啦)。
关于ImageView组件方面的一些细节就记录在本篇内。
setColorFilter
ImageView#setColorFilter(int color, PorterDuff.Mode mode))
setColorFilter()用于给ImageView内容进行着色(tint),即改变原有内容的颜色。
错误
而小编一开始写的代码如下:
1 | ImageView iv; |
结果没有setColorFilter()
没有起到效果。
原因
查看源码得知:
- ImageView.setColorFilter()方法是作用在成员变量mDrawable上的,即xml内ImageView标签的
android:src
属性 - setBackgroundResource()方法是设置背景的,作用在ImageView的父类View的成员变量mBackground上的。
所以总结下来就是上述无效果的代码是因为设置到了两个对象上,才会导致最终没有效果。
修改
综上所述,修改方式有两种:
图片资源和着色都设置到ImageView背景上
1
2
3
4
5Drawable drawable = ContextCompat.getDrawable(this, R.drawable.ic_setting);
if (drawable != null) {
drawable.setColorFilter(ContextCompat.getColor(this, R.color.colorPrimary), PorterDuff.Mode.SRC_IN);
iv.setBackgroundDrawable(drawable);
}图片资源和着色都设置到ImageView内容上
1
2iv.setImageResource(R.drawable.ic_setting);
iv.setColorFilter(ContextCompat.getColor(this, R.color.colorPrimary), PorterDuff.Mode.SRC_IN);
源码分析
setColorFilter()有3个重载方法,具体如下源码:
1 | /** |
可以看到最终都调用到了 setColorFilter(ColorFilter cf)
方法上。setColorFilter(ColorFilter cf)
内部又会调用applyColorMod()
。其代码如下,可以看到最总是调用到了mDrawable.setColorFilter(mColorFilter)
上。
1 | private void applyColorMod() { |
而mDrawable
通过查看源码内赋值的地方,可以确定为ImageView显示的内容(非背景)。因为源码内setImageBitmap、setImageDrawable、setImageResource、setImageURI、setImageIcon都是直接或间接调用了updateDrawable方法,其内部会将显示内容赋值给mDrawable。
1 | private void updateDrawable(Drawable d) { |