2014-02-17 3 views
26

ImageView имеет два метода связанных методов: setAlpha и setImageAlpha. Первый из них доступен с уровня API 1, но он устарел с уровня 16. Последний доступен с уровня 16. Существует также еще один метод setAlpha, из класса View, и это введено в API уровне 11.Разница между setAlpha и setImageAlpha

Это разница между ImageView # setAlpha и ImageView # setImageAlpha только в названии? Есть ли разница в поведении? Какая связь между View # setAlpha и ImageView # setAlpha?

ответ

37

ImageView.setAlpha(int) был переименован в ImageView.setImageAlpha(int), чтобы избежать путаницы с новым методом View.setAlpha(float), введенного в уровне API 11.

View.setAlpha(float) является общим методом на всех View с, в том числе ImageView. Он применяет указанную непрозрачность ко всему виду. Чтобы достичь этого, по умолчанию система создает временный буфер (аппаратный уровень), где представление рисуется как обычно, затем буфер рисуется на экране с указанным значением альфа. Это двухпроходный механизм, который требует первоначального выделения буфера, поэтому он несколько медленнее. Смотрите это видео для получения дополнительной информации и о том, как изменить поведение по умолчанию: Hidden Cost of Transparency. Важно отметить, что ImageView включает в себя оптимизацию, которая позволит избежать выделения этого буфера, если у него нет фона, поэтому на практике не будет штрафа за производительность при вызове ImageView.setAlpha(float), если у ImageView нет фона.

ImageView.setImageAlpha(int)ImageView.setAlpha(int)) являются методами, соответствующими ImageView.Они управляют альфа-значением, которое используется для рисования содержимого изображения (растрового изображения или другого) непосредственно на экране без промежуточного прохода, поэтому это предпочтительный метод, используемый для применения прозрачности к изображению, отображаемому ImageView. Конечно, если вы установите для фона ImageView фоновый рисунок, что вы также хотите быть полупрозрачным, этот метод не даст ожидаемого результата.

+1

Это наиболее полная и точный ответ. Не понимаю, почему его рейтинг самый низкий. Это должен быть принятый ответ. –

+0

стоит отметить, что в настоящее время setImageAlpha() не работает, когда ресурс является адаптивным значком. В этом случае вместо этого используйте View.setAlpha(). https://issuetracker.google.com/issues/72694861 –

1

Я считаю, что только именование - это разница. Потому что setImageAlpha() более конкретно, чем setAlpha(). Для View#setAlpha и ImageView#setAlpha/setImageAlpha нет прямого отношения. Класс View имеет setAlpha, потому что он может функционировать как родительский элемент View#ImageView, поэтому он функционирует как контейнер.

С помощью setAlpha вы можете установить непрозрачность всего контейнера, чтобы он нуждался в этом методе. с setImageAlpha вы можете установить альфу только изображения, а не всего контейнера.

Помимо этого, я не могу думать о причине, по которой у них есть как альфа-метод.

+1

Вы нажимаете на ключевое различие между 'setAlpha()' и 'setImageAlpha()' С помощью setAlpha вы можете установить непрозрачность для всего контейнера, чтобы он нуждался в этом методе. с помощью setImageAlpha вы можете установить альфу только изображения, а не всего контейнера. – CrimsonX

+0

@CrimsonX: Если посмотреть на исходный код (например, в ответе Кании), кажется, что различие в поведении, которое вы описываете, фактически не существует. Эти два метода делают то же самое. Поэтому кажется, что этот ответ и комментарий неверны. – LarsH

4

да, это только разница именования - текущая реализация в источнике Android уровня 16 API является:

/** 
* Sets the alpha value that should be applied to the image. 
* 
* @param alpha the alpha value that should be applied to the image 
* 
* @see #getImageAlpha() 
*/ 
@RemotableViewMethod 
public void setImageAlpha(int alpha) { 
    setAlpha(alpha); 
} 
+1

Это правда, однако setAlpha() имеет аннотацию @Deprecated, поэтому, скорее всего, реализация setImageAlpha() изменится в будущем. –

27
  • View.setAlpha(float) принимает поплавок в качестве входных данных и ожидает, что значение в диапазоне от 0. .1 включительно.
  • ImageView.setAlpha(int) принимает входной сигнал int и ожидает значение в диапазоне 0..255 включительно. ImageView.setAlpha(int) устарел. Вероятно, это связано с тем, что они хотели удалить конфликт с базовыми View.setAlpha(float)
  • Как указывали другие респонденты, ImageView.setImageAlpha(int) просто обращается к устаревшим ImageView.setAlpha(int). Вы должны ожидать, что ImageView.setAlpha(int) будет удален в будущем обновлении API и поэтому должен избегать его использования.
+10

Этот ответ неоднозначен. 'ImageView.setAlpha (int)' устарел только из-за его имени, и он был переименован в 'ImageView.setImageAlpha (int)'. Когда вам нужно применить альфа-фильтр в ImageView, предпочтительнее использовать 'setImageAlpha (int)' или устаревший 'setAlpha (int)', потому что они применяют альфа-значение непосредственно к основной «Paint», которая рисует изображение на Canvas, в то время как setAlpha (float) создает временный буфер, где отображается ваш вид, затем буфер смешивается с остальной частью экрана с указанным значением альфа. – BladeCoder

+0

Chet Haase разъясняет, что @BladeCoder указал в [Google I/O 2013 - видео с графикой производительности Android] (https://www.youtube.com/watch?v=vQZFaec9NpA#t=32m59s) – azizbekian

Смежные вопросы