#android #imageview #alpha #colorfilter
#Android #imageview #альфа #colorfilter
Вопрос:
Мне нужно, чтобы мой пользовательский ImageView (вызываемый ItemAnimationView
) не рисовал прозрачную часть своего изображения.
Я использую этот класс для множества экземпляров и для множества разных изображений, поэтому было бы лучше, если бы я мог решить эту проблему только с помощью методов, которые я могу вызвать ImageView
, поскольку редактирование всех разных изображений вручную не сработает.
Итак, есть ли какой ColorFilter
-то способ, который не только отфильтровывает один определенный цвет, но и каждый пиксель, который прозрачен в любой степени?
Также было бы весьма удобно, если бы был способ сделать это без доступа к фактическому растровому изображению, поскольку единственными строками кода, которые я пока использую для просмотра, являются
setImageResource(item.getResourceID());
и немного анимации, поэтому у меня нет связанного Bitmap
объекта.
Комментарии:
1.
"I need my custom ImageView (called ItemAnimationView) to not draw any part of its image that is transparent."
— что здесь означает «прозрачный»? (альфа-канал! = 255)?2. Точно. Я хочу видеть только пиксели, которые имеют альфа-значение
255
.3. попробуйте поиграть с
ColorMatrixColorFilter
— я думаю, вы могли бы это сделать, но вам нужно будет немного погуглить об этой цветовой матрице (и прочитатьandroid.graphics.ColorMatrix
официальные документы)4. 3-минутный поиск в Google дает: quasimondo.com/colormatrix/ColorMatrix.as — у него есть
thresholdAlpha
функция — но я понятия не имею, как это работает (или даже если это одна и та же матрица)5. Я вроде понимаю это, но проблема в том, что этот метод имеет входные данные, а java ColorMatrixFilters дают возможность масштабировать и преобразовывать значения без каких-либо аргументов. Если бы я мог использовать исходное альфа-значение в качестве аргумента пользовательской математической функции, я бы знал, как решить проблему…
Ответ №1:
Я добился желаемого эффекта, используя a ColorMatrixColorFilter
с этой матрицей:
{1f,0f,0f,0f,0f,
0f,1f,0f,0f,0f,
0f,0f,1f,0f,0f,
0f,0f,0f,256f,-256*254};
Комментарии:
1. когда я вижу это сейчас, как насчет: 0, 0, 0, 256, -256 * 255 ? я имею в виду
factor=256
иthreshold=255
? (или, может быть, порог = 254)?2. действительно, я провел быстрый тест —
0, 0, 0, 256, -256 * 254
это то, что вам нужно3. спасибо, я обновил ответ (предполагая
254
, что это не опечатка, или так и должно было быть255
)?4.сначала я попробовал 255, но оказалось, что каждый пиксель исчез — если вы видите, как вычисляется альфа:
A’ = p*R q*G r*B s*A t
— в вашем случае это тоA’ = 0*R 0*G 0*B 256*A (-256 * 255)
, что есть:A’ = 256 * A - 256 * 255
— так что, еслиA == 255
тогдаA' == 0
, но с 254, это:A’ = 256 * A - 256 * 254
и дляA == 255
A’ == 255
и 0 для любого другогоA