Как я могу создать ImageView, который не отображает прозрачные части изображения?

#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