Примените ColorFilter, но сохраните прозрачную тень в файле PNG

Я применяю ColorFilter к Drawable. Я хотел знать, можно ли изменить цвет рисунка, но сохранить в нем тень.

Что-то вроде этого:

введите описание изображения здесь

Где, если вы применили что-то вроде:

view.getBackground().setColorFilter(new PorterDuffColorFilter(itemView.getResources().getColor(R.color.green_500), PorterDuff.Mode.SRC_IN);

Это применит этот ColorFilter, но сохранит значения тени и альфа-канала.

Как я могу этого добиться?


person AndyRoid    schedule 29.01.2016    source источник
comment
используйте 1_   -  person IntelliJ Amiya    schedule 29.01.2016
comment
Делает мой рисунок полностью прозрачным   -  person AndyRoid    schedule 29.01.2016
comment
softwyer.wordpress.com/2012/01/21/1009   -  person IntelliJ Amiya    schedule 29.01.2016
comment
@AndyRoid К какому представлению вы пытаетесь применить ColorFilter? Используете ли вы FloatingActionButton из библиотеки поддержки Android или любой подобной библиотеки?   -  person TR4Android    schedule 04.06.2016


Ответы (3)


Я думаю, что вам нужен переключатель оттенков. Если это так, используйте ColorFilterGenerator, предложенный в Понимание использования ColorMatrix и ColorMatrixColorFilter для изменения оттенка Drawable вам просто нужно сделать:

view.getBackground().setColorFilter(ColorFilterGenerator.adjustHue(180));

Результат выглядит так (оттенок повернут на 180 градусов):

введите здесь описание изображения

Примечание. Все заслуги в этом ответе должны принадлежать @Richard Lalancette за его потрясающий ответ на вопрос, на который я дал ссылку.

Обновление из комментариев:

Поскольку вам нужно указать целевой цвет, вы можете рассчитать исходное и целевое значения HSV и использовать ColorFilterGenerator для изменения оттенка. Например:

// Your source color (The RGB color from your original image is 255,85,78)
float[] hsvSource = new float[3];
Color.RGBToHSV(255, 85, 78, hsvSource);

// The color whose hue you want to achieve (green for example)
float[] hsvTarget = new float[3];
Color.RGBToHSV(0, 200, 18, hsvTarget);

view.getBackground().setColorFilter(ColorFilterGenerator.adjustHue(hsvTarget[0] - hsvSource[0]));

Обратите внимание, что этот подход учитывает только значения оттенков цветов, чтобы изменить их.

Обновление из комментариев:

Замечательный ответ @Jared Rummler (Понимание использования ColorMatrix и ColorMatrixColorFilter для изменения оттенка Drawable) принимает ваш drawable в качестве параметра, поэтому вам не нужно указывать исходный цвет:

view.getBackground().setColorFilter(ColorFilterGenerator.from(view.getBackground()).to(Color.GREEN));
person antonio    schedule 07.06.2016
comment
Я использовал это раньше, но не могу установить определенный цвет - person AndyRoid; 07.06.2016
comment
Ответ @Jared Rummler блестящий. я голосую за это - person antonio; 08.06.2016
comment
Проверю оба, я тестировал ответ Джареда несколько месяцев назад, но, возможно, я делал что-то не так, спасибо за обновления, ребята! Оба блестящие ответы - person AndyRoid; 08.06.2016
comment
Чтобы было ясно, я знаю, что смещение оттенков осуществляется путем поворота угла оттенка, но в моем случае мне нужно вообще установить определенный цвет и сохранить тени и прозрачность. - person AndyRoid; 08.06.2016
comment
Как я уже говорил в последнем обновлении, решение @Jared использует ваш существующий рисунок в качестве параметра, получает его средний цвет и преобразует его в ваш целевой цвет. И не только его метод сохраняет тени и прозрачность, но также учитывает насыщенность и яркость (помимо оттенка), это главная причина, потому что это так потрясающе. - person antonio; 08.06.2016
comment
Я смог заставить решение работать, но цвета были выключены. Я думаю, что это возможно, если еще немного исправить решение Джарреда. Это простой RGB (255, 0, 0) для скорректированного значения цвета, и я все еще получаю от цветов. Я расследую, почему это происходит. - person AndyRoid; 08.06.2016

Правильный (и, вероятно, единственный) способ добиться того, чего вы хотите, - это разделить рисуемый объект на несколько слоев и использовать layerDrawable для их составления. В этот момент у вас может быть цветовой слой, который вы можете изменить (и вам даже не нужно будет использовать портер дафф)

person Pasquale Anatriello    schedule 02.06.2016

я столкнулся с проблемой с прозрачной частью png и тенью, этот код работал для меня.

  // The colorPrimary is color you want to achieve 
    float colorRed = Color.red(colorPrimary) / 255f;
    float colorGreen = Color.green(colorPrimary) / 255f;
    float colorBlue = Color.blue(colorPrimary) / 255f;

    drawable.setColorFilter(new ColorMatrixColorFilter(new ColorMatrix(new float[]{
            1 - colorRed, 0,              0,             0,     colorRed * 255,
            0,            1 - colorGreen, 0,             0,     colorGreen * 255,
            0,            0,              1 - colorBlue, 0,     colorBlue * 255,
            0,            0,              0,             Color.alpha(colorPrimary) / 255f, 0,
    })));
    img.setImageDrawable(drawable);
person Usama Saeed US    schedule 21.09.2019