为什么在所有地方都使用drawable颜色过滤器?

5
在我的应用程序的一个部分中,我需要将我的可绘制资源 R.drawable.blah 进行白色过滤(原本是红色),因此我有以下方法:
public final static Drawable getFilteredDrawable(Context context, @DrawableRes int drawable, @ColorRes int color) {
    Drawable d = ContextCompat.getDrawable(context, drawable);
    d.setColorFilter(ContextCompat.getColor(context, color), PorterDuff.Mode.SRC_IN);
    return d;
}

我是这样使用它的:

DrawableUtil.getFilteredDrawable(this, R.drawable.blah, android.R.color.white);

问题是现在整个应用程序中的可绘制部分都变成了白色,即使没有应用过滤器。我希望在应用程序的这一部分中可绘制部分为白色,但它在我使用它的每个地方都是白色的。
我该如何解决这个问题?

1
你正在修改drawable,而不是复制。你应该在你的资源中创建一个副本,例如,来解决你的问题。 - ddb
1个回答

11

请使用此方法代替,以确保您使用的是可绘制对象的副本。

public final static Drawable  getFilteredDrawable(Context context, @DrawableRes int drawable, @ColorRes int color) {
    Drawable d = ContextCompat.getDrawable(context, drawable).getConstantState().newDrawable().mutate(); //so we are sure we are using a copy of the original drawable
    d.setColorFilter(ContextCompat.getColor(context, color), PorterDuff.Mode.SRC_IN);
    return d;
}

1
这个救了我。非常感谢 :) - Oguzhan Orhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接