我需要3个图标:ContextCompat.getDrawable(this, R.drawable.my_vector_drawable)
。
首先 - 没有色调,第二个 - 有色调,第三个 - 没有色调,
确定。
ImageView img1 = (ImageView) findViewById(R.id.img1);
ImageView img2 = (ImageView) findViewById(R.id.img2);
ImageView img3 = (ImageView) findViewById(R.id.img3);
Drawable drawable1 = ContextCompat.getDrawable(this, R.drawable.my_vector_drawable);
Drawable drawable2 = DrawableCompat.wrap(ContextCompat.getDrawable(this, R.drawable.my_vector_drawable));
DrawableCompat.setTintMode(drawable2, PorterDuff.Mode.MULTIPLY);
DrawableCompat.setTintList(drawable2, ContextCompat.getColorStateList(this, R.color.menu_tint_colors));
Drawable drawable3 = ContextCompat.getDrawable(this, R.drawable.my_vector_drawable);
img1.setImageDrawable(drawable1);
img2.setImageDrawable(drawable2);
img3.setImageDrawable(drawable3);
其中R.drawable.my_vector_drawable
是白人。
但结果 - 带有色调的3个图标(为什么?!)。
例如,我尝试设置ContextCompat.getColor(this, R.color.somecolor)
,结果是......带有色调的两个图标!图标2和3,以及第一个图标 - 没有色调(为什么?!)
如何加载NOT缓存的drawable?或者如何解决这个问题? AppCompat 23.4。+
答案 0 :(得分:2)
你必须mutate()
你的抽签。
现在你引用完全相同的来源。一旦你改变你的drawable,每个人都会有自己的状态。
Drawable d = ContextCompat.getDrawable(this, R.drawable.my_vector_drawable).mutate();
来自docs:
使这个drawable可变。此操作无法逆转。一个可变的drawable保证不与任何其他drawable共享其状态。当您需要修改从资源加载的drawable的属性时,这尤其有用。默认情况下,从同一资源加载的所有drawables实例共享一个公共状态;如果修改一个实例的状态,则所有其他实例将收到相同的修改。在可变的 Drawable 上调用此方法将无效。
答案 1 :(得分:0)
@azizbekian 的回答是正确的,但在某些情况下,为每个可绘制对象都这样做可能效率低下。查看this answer了解更多详情。
我建议使用 TintedIconCache
而不是改变您的可绘制对象。它将管理着色可绘制对象的缓存,以便它们仅在需要时创建一次,然后以内存高效的方式缓存以供后续使用。这是一个单一的类,您可以从 this gist 中获取。
// Get an instance
final TintedIconCache cache = TintedIconCache.getInstance();
// Will be fetched from the resources
Drawable backIcon = cache.fetchTintedIcon(context, R.drawable.icon, R.color.black));
// Will be fetched from the resources as well
Drawable bleuIcon = cache.fetchTintedIcon(context, R.drawable.icon, R.color.bleu));
// Will be fetched from the cache, with no mutation!!!
Drawable backIconTwo = cache.fetchTintedIcon(context, R.drawable.icon, R.color.back));