setColorFilter有时在android drawable上不起作用

时间:2017-07-08 09:10:52

标签: java android drawable colorfilter

我正在尝试在drawable上应用滤镜,具体取决于用户在首选项中选择的原色。这是我正在使用的一段代码。

getResources().getDrawable(R.drawable.ic_batman_1)
            .setColorFilter(ColorHelper.getPrimaryColor(), PorterDuff.Mode.OVERLAY);

问题是,有时候,这段代码不会改变drawable的滤色器。我已将此代码放在我的活动(主要活动)onCreate和onResume方法中。

因此,只要应用程序启动,我希望将此滤镜应用于该drawable,但有时它不会发生。我也注意到这个问题不是在高端手机(高速处理器,更多RAM)上发生,而是仅在低端手机上发生。

但是,如果我浏览任何其他活动并返回主要活动,则应用颜色过滤器。调试代码和setColorFilter在使用适当的颜色参数启动时被调用,但由于某种原因它没有得到应用。任何形式的帮助都表示赞赏。

请不要低估这个问题,如果你认为这是一个愚蠢的问题,只需评论,我会把问题记下来。我因为提出问题而被禁止在SO上。

1 个答案:

答案 0 :(得分:3)

你试试Drawable.mutate();像这样的财产,

Drawable drawable = ContextCompat.getDrawable(context, resource).mutate();

drawable.setColorFilter(ColorHelper.getPrimaryColor(), PorterDuff.Mode. OVERLAY);
/**
 * Make this drawable mutable. This operation cannot be reversed. A mutable
 * drawable is guaranteed to not share its state with any other drawable.
 * This is especially useful when you need to modify properties of drawables
 * loaded from resources. By default, all drawables instances loaded from
 * the same resource share a common state; if you modify the state of one
 * instance, all the other instances will receive the same modification.
 *
 * Calling this method on a mutable Drawable will have no effect.
 *
 * @return This drawable.
 * @see ConstantState
 * @see #getConstantState()
 */
public @NonNull Drawable mutate() {
    return this;
}