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

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

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

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

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

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

Он применил бы ColorFilter но сохранил бы тени и альфа-значения.

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

    Я думаю, что вам нужен оттенок. Если это так, используя 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)); 

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