Что означает андроид getIntrinsicHeight и getIntrinsicWidth?

Привет, меня смущают два метода из класса Android Drawable

getIntrinsicHeight()
getIntrinsicWidth()
Определение

api говорит http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getIntrinsicHeight()

Что означает слово "внутренняя высота/ширина"? Я имею в виду, это ширина фактического изображения?

Ответ 1

Если вы хотите знать значение внутреннего, это не что иное, как фактическое свойство, которым обладает объект. В нашем случае getIntrinsicWidth/Height просто означает предоставить вам высоту или ширину по умолчанию для этой возможности.

Это возвращает точный размер извлекаемого файла, который вы поместили в папку ресурса без каких-либо изменений.

Теперь вы должны знать, что getWidth или height вернет значение, которое может варьироваться в зависимости от ширины и высоты, которые вы указываете для своего ImageView в вашем макете xml.

Предположим, что вы указали ширину и высоту вашего ImageVIew как 100 * 100 в макете xml, а выталкиваемый вами, используемый в качестве фона, имеет размер 200 * 200.

Теперь getIntrinsicWidth должен возвращать 200, тогда как getWidth должен возвращать 100.

Ответ 2

связанный вопрос fooobar.com/questions/114742/....

Если ваш образ загружен из Интернета, .getIntrinsicWidth() и .getIntrinsicHeight() действительно дают вам "реальную" ширину и высоту изображения соответственно.

Он называется внутренним, потому что он зависит ТОЛЬКО от изображения и ни о чем другом (например, о вашем телефоне).

Увы, то, что вы получаете, НЕ является неотъемлемым при любых обстоятельствах - к сожалению, это зависит от других вещей, кроме изображения.

Здесь вы получаете неправильный результат (а именно, неинтерактивный). Скажем, вы используете значок запуска по умолчанию, затем

Log.i("", "ic_launcher intrinsic width " + getResources().getDrawable(R.drawable.ic_launcher).getIntrinsicWidth());

сообщит вам ширину (в пикселях) значка запуска. Но какой из них? - у вас есть несколько из них: одна в папке drawable-xhdpi, одна в папке drawable-hdpi и т.д. Ну, если ваше устройство, скажем, xhdpi, дает вам 96, что действительно является шириной пикселя версии значок запуска, находящийся в папке drawable-xhdpi. Теперь удалите значок в папке drawable-xhdpi и снова запустите (все еще используя устройство xhdpi (реальное или эмулированное)). Изображение, которое будет использоваться, будет из папки drawable-hdpi, потому что это "самое близкое" к версии xhdpi. Этот значок имеет ширину пикселя 72. Но над кодом будет ВСЕ ЕЩЕ ВАМ 96!!!

Это явно НЕ "внутренне" (в собственном смысле слова), поскольку оно не зависит только от используемого изображения.

Итак, если вы так ленивы, как я, и поэтому не генерируете 4 версии каждого значка/образа ресурса (но вместо этого используйте только 1 или 2 и масштабируя их вручную), вы должны остерегаться упомянутого андроидального неправильного выражения.

Ответ 3

В android drawable может быть много типов, таких как цвет, растровое изображение, форма и т.д.

Некоторые из этих чертежей имеют внутреннюю высоту, такую ​​как BitmapDrawable, которая является размером изображения.

Жесткие элементы, такие как ColorDrawable (используемые для рисования сплошных цветов), не имеют внутренней высоты. В этом случае значение getIntrinsicHeight/Width возвращает -1.

Даже если drawable не имеет собственной высоты/ширины, каждая выталкиваемая должна иметь свои границы, прежде чем они смогут отобразить себя (например, перед вызовом mydrawable.draw(canvas))

Если вы используете выделение в качестве фона для представления, представление внутренне устанавливает границы для вас. Но если вы используете drawables в своем собственном onDraw, вам нужно явно установить границы через setBounds.