SetColorFilter не работает

Я пытаюсь реализовать простой цветной фильтр на изображении, чтобы превратить черное изображение в белое изображение. Для этого я делаю следующее:

    weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
    weatherImg.setImageResource(R.drawable.b_clouded_rain);

Я также попытался изменить цвет в цветовом фильтре на красный и белый, но все они не имеют никакого эффекта, что я делаю неправильно?

Ответ 1

Насколько я ненавижу отвечать на свои вопросы, я нашел проблему: Я должен был использовать:

   weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);

Ответ 2

Это зависит от того, какую фильтрацию вы хотите применить. Если вы хотите применить новый цвет на изображении с прозрачными пленками на нем, то то, что сработало для меня:

weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);

Если вы хотите узнать больше об этих фильтрах PorterDuff, я нашел статью goog, которая помогла мне понять: http://www.ibm.com/developerworks/java/library/j-mer0918/ дать ей следующее:)

Ответ 3

Имела ту же проблему на Android 6. Решена с помощью ImageView.getDrawable().setColorFilter() вместо ImageView.setColorFilter().

Ответ 4

У меня были проблемы с setColorFilter на Samsung S3 с запуском 4.3, и единственный способ заставить фильтр работать - это применить его в методе draw(Canvas canvas):

public class ColouredDrawable extends BitmapDrawable {

private ColorFilter mColorFilter;

public ColouredDrawable(Bitmap toTransform, int toColour, Resources resources) {
    super(resources, toTransform);
    float[] matrix = {
            0, 0, 0, 0, ((toColour & 0xFF0000) / 0xFFFF),
            0, 0, 0, 0, ((toColour & 0xFF00) / 0xFF),
            0, 0, 0, 0, (toColour & 0xFF),
            0, 0, 0, 1, 0 };
    mColorFilter = new ColorMatrixColorFilter(matrix);
}

@Override
public void draw(Canvas canvas) {
    setColorFilter(mColorFilter);
    super.draw(canvas);
}

Простое применение setColorFilter к BitmapDrawable не оказало никакого эффекта.

Ответ 5

Мы используем этот код

Drawable drawable = DrawableCompat.wrap(getDrawable(drawableResource));
        drawable.mutate();
        DrawableCompat.setTint(drawable, getColor(color));
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

public static int getColor(int id) {
        return ContextCompat.getColor(getInstance().context, id);
    }

public static Drawable getDrawable(int id) {
        return ContextCompat.getDrawable(getInstance().context, id);
    }

Ответ 6

Для меня работало только это решение:

image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
image.setImageResource(R.drawable.img);

фильтр применяется, если R.drawable.img является векторным изображением и не влияет на ресурс растра