Android:Tint三个图标中的一个

时间:2017-03-27 09:56:17

标签: android drawable android-drawable android-resources android-vectordrawable

我需要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。+

2 个答案:

答案 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));