Я работаю над пользовательским интерфейсом для приложения, и я пытаюсь использовать значки в градациях серого и позволяю пользователю изменять тему на цвет по своему выбору. Для этого я пытаюсь просто применить какой-то ColorFilter, чтобы наложить цвет поверх рисованного. Я пробовал использовать PorterDuff.Mode.MULTIPLY, и он работает почти так, как мне нужно, за исключением того, что белые цвета также накладываются на цвет. В идеале я ищу что-то вроде режима наложения «Цвет» в Photoshop, где графика сохраняет свою прозрачность и яркость, а только изменяет цвет изображения. Например:
становится
После некоторого исследования выяснилось, что класс ColorMatrixColorFilter может делать то, что мне нужно, но я не могу найти какие-либо ресурсы, указывающие на то, как используется матрица. Это матрица 4х5, но мне нужно знать, как я подхожу к проектированию матрицы. Есть идеи?
РЕДАКТИРОВАТЬ: Итак, что я нашел до сих пор по этому поводу, следующее:
1 0 0 0 0 //red
0 1 0 0 0 //green
0 0 1 0 0 //blue
0 0 0 1 0 //alpha
Где эта матрица является единичной матрицей (когда применяется, не вносит изменений), а числа варьируются от 0 до 1 (плавает). Эта матрица будет умножаться на каждый пиксель для преобразования в новый цвет. Вот тут-то мне и становится неясно. Поэтому я бы подумал, что каждый пиксель будет вектором 1 x 4, содержащим значения argb (например, 0,2, 0,5, 0,8, 1
), которые будут отмечены матрицей преобразования. Таким образом, чтобы удвоить интенсивность красного цвета изображения, вы должны использовать такую матрицу, как:
2 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
, которая даст вам вектор (цвет) 0,4, 0,5, 0,8, 1
. Судя по ограниченному тестированию, это так и работает правильно, но на самом деле я все еще сталкиваюсь с той же проблемой (т.е. белые приобретают окраску). Дальнейшее чтение говорит мне, что это связано с тем, что он выполняет преобразование значений RGB, тогда как для сдвига оттенка значения сначала должны быть преобразованы в значения HSL. Так что, возможно, я мог бы написать класс, который бы считывал изображение, преобразовывал цвета и перерисовывал изображение с новыми цветами. Это создает ДРУГОЙ проблему с StateListDrawables, так как я не уверен, как я буду собирать каждый из них в коде и изменять все из них, и насколько медленным это будет процесс. : /
Хм, хорошо, так что я предполагаю, что у меня возник бы еще один вопрос: можно ли использовать матрицу для преобразования RGB в другое цветовое пространство с информацией о яркости, например L a b или HSL? Если это так, я мог бы просто умножить матрицу для этого разговора, затем отрегулировать оттенок для этой матрицы, а затем применить эту матрицу как ColorFilter.