? Я думаю, что в стандартных библиотеках java / android такого класса нет.

отаю над пользовательским интерфейсом для приложения и пытаюсь использовать значки в градациях серого и разрешить пользователю изменять тему на цвет по своему выбору. Чтобы сделать это, я пытаюсь просто применить какой-либо 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 в другое цветовое пространство с информацией о яркости, такой как Laб или HSL? Если это так, я мог бы просто умножить матрицу для этого разговора, затем выполнить настройку оттенка для матрицы ТА, а затем применить эту матрицу в качестве ColorFilter.

Ответы на вопрос(9)

Ваш ответ на вопрос