- ImageView
- Общая информация
- Метод setImageResource()
- Метод setImageBitmap()
- Метод setImageDrawable()
- Метод setImageURI()
- Другие методы
- Масштабирование через свойство Scale Type
- Атрибут android:adjustViewBounds=»true»
- Загрузка изображения из галереи
- Получить размеры ImageView — будьте осторожны
- Копирование изображений между ImageView
- Примеры
- Как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон
- 26 ответов
- Как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон
- Поместите изображение в ImageView, сохраните соотношение сторон, а затем измените размер ImageView на размеры изображения?
- 13 ответов
ImageView
Общая информация
Компонент ImageView предназначен для отображения изображений. Находится в разделе Widgets.
Для загрузки изображения в XML-файле используется атрибут android:src, в последнее время чаще используется атрибут app:srcCompat.
ImageView является базовым элементом-контейнером для использования графики. Можно загружать изображения из разных источников, например, из ресурсов программы, контент-провайдеров. В классе ImageView существует несколько методов для загрузки изображений:
- setImageResource(int resId) — загружает изображение по идентификатору ресурса
- setImageBitmap(Bitmap bitmap) — загружает растровое изображение
- setImageDrawable(Drawable drawable) — загружает готовое изображение
- setImageURI(Uri uri) — загружает изображение по его URI
Метод setImageResource()
Сначала нужно получить ссылку на ImageView, а затем используется идентификатор изображения из ресурсов:
Метод setImageBitmap()
Используется класс BitmapFactory для чтения ресурса изображения в объект Bitmap, а затем в ImageView указывается полученный Bitmap. Могут быть и другие варианты.
Метод setImageDrawable()
Если у вас есть готовое изображение, например, на SD-карте, то его можно использовать в качестве объекта Drawable.
Drawable можно получить и из ресурсов, хотя такой код выглядит избыточным, если можно сразу вызвать setImageResource().
Метод setImageURI()
Берётся URI файла изображения и используется в качестве источника изображения. Этот способ годится для работы с локальными изображениями.
Загружаем Drawable через URI.
Другие методы
Также вам часто придется использовать методы, связанные с размерами и масштабированием: setMaxHeight(), setMaxWidth(), getMinimunHeight(), getMinimunWidth(), getScaleType(), setScaleType().
Масштабирование через свойство Scale Type
Для масштабирования картинки в ImageView есть свойство Scale Type и соответствующий ему атрибут android:scaleType и перечисление ImageView.ScaleType.
- CENTER
- CENTER_CROP
- CENTER_INSIDE
- FIT_CENTER
- FIT_START
- FIT_END
- FIT_XY
- MATRIX
Чтобы увидеть разницу между разными режимами, желательно использовать большую картинку, превосходящую по ширине экрана устройства. Допустим, у нас есть простенькая разметка:
Для наглядности я задал красный цвет для фона ImageView.
Режим android:scaleType=»center» выводит картинку в центре без масштабирования. Если у вас будет картинка большего размера, то края могут быть обрезаны.
Режим android:scaleType=»centerCrop» также размещает картинку в центре, но учитывает ширину или высоту контейнера. Режим попытается сделать так, чтобы ширина (или высота) картинки совпала с шириной (или высотой) контейнера, а остальное обрезается.
Режим android:scaleType=»centerInside» масштабирует картинку, сохраняя пропорции. Можно увидеть задний фон контейнера, если его размеры отличаются от размера картинки.
Режим android:scaleType=»fitCenter» (по умолчанию) похож на предыдущий, но может не сохранять пропорции.
Если выбрать режим android:scaleType=»fitStart», то картинка прижимается к левому верхнему углу и таким образом заполняет верхнюю половину контейнера.
Значение android:scaleType=»fitEnd» сместит картинку в нижнюю часть контейнера.
Режим android:scaleType=»fitXY» растягивает/сжимает картинку, чтобы подогнать её к контейнеру. Может получиться вытянутая картинка, поэтому будьте осторожны.
Последний атрибут android:scaleType=»matrix» вывел картинку без изменений в левом верхнем углу с обрезанными краями.
Атрибут android:adjustViewBounds=»true»
При использовании атрибута scaleType=»fitCenter» из предыдущего примера Android вычисляет размеры самой картинки, игнорируя размеры ImageView. В этом случае ваша разметка может «поехать». Атрибут adjustViewBounds заставляет картинку подчиниться размеру компонента-контейнера. В некоторых случаях это может не сработать, например, если у ImageView установлен атрибут layout_width=»0dip». В таком случае поместите ImageView в RelativeLayout или FrameLayout и используйте значение 0dip для этих контейнеров.
Загрузка изображения из галереи
Предположим, у вас есть на экране компонент ImageView, и вы хотите загрузить в него какое-нибудь изображение из галереи по нажатию кнопки:
Намерение ACTION_PICK вызывает отображение галереи всех изображений, хранящихся на телефоне, позволяя выбрать одно изображение. При этом возвращается адрес URI, определяющий местоположение выбранного изображения. Для его получения используется метод getData(). Далее для преобразования URI-адреса в соответствующий экземпляр класса Bitmap используется специальный метод Media.getBitmap(). И у нас появляется возможность установить изображение в ImageView при помощи setImageBitmap().
На самом деле можно поступить ещё проще и использовать метод setImageURI.
Сравните с предыдущим примером — чувствуете разницу? Тем не менее, приходится часто наблюдать подобный избыточный код во многих проектах. Это связано с тем, что метод порой кэширует адрес и не происходит изменений. Рекомендуется использовать инструкцию setImageURI(null) для сброса кэша и повторный вызов метода с нужным Uri.
В последних версиях системных эмуляторов два примера не работают. Проверяйте на реальных устройствах.
Получить размеры ImageView — будьте осторожны
У элемента ImageView есть два метода getWidth() и getHeight(), позволяющие получить его ширину и высоту. Но если вы попробуете вызвать указанные методы сразу в методе onCreate(), то они возвратят нулевые значения. Можно добавить кнопку и вызвать данные методы через нажатие, тогда будут получены правильные результаты. Либо использовать другой метод активности, который наступает позже.
Копирование изображений между ImageView
Если вам надо скопировать изображение из одного ImageView в другой, то можно получить объект Drawable через метод getDrawable() и присвоить ему второму компоненту.
Примеры
В моих статьях можно найти примеры использования ImageView.
Источник
Как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон
В Android я определил layout_width для ImageView как fill_parent (который занимает всю ширину телефона).
Если изображение, которое я помещаю в ImageView больше, чем layout_width , Android масштабирует его, верно? А как насчет высоты? Когда Android масштабирует изображение, сохранит ли оно соотношение сторон?
Я обнаружил, что есть небольшое пространство вверху и внизу ImageView , когда Android масштабирует изображение, которое больше, чем ImageView . Это правда? Если да, как я могу удалить это пустое пространство?
26 ответов
Да, по умолчанию Android масштабирует ваше изображение до размера ImageView, сохраняя соотношение сторон. Однако убедитесь, что вы устанавливаете изображение для ImageView, используя android:src=»https://question-it.com/questions/4932058/» , а не android:background=». » . src= заставляет масштабировать изображение с сохранением соотношения сторон, но background= заставляет масштабировать и изображение, чтобы оно точно соответствовало размеру ImageView. (Однако вы можете использовать фон и источник одновременно, что может быть полезно для таких вещей, как отображение рамки вокруг основного изображения, используя только один ImageView.)
Вы также должны увидеть android:adjustViewBounds , чтобы изменить размер ImageView в соответствии с масштабируемым изображением. Например, если у вас есть прямоугольное изображение в том, что обычно является квадратным ImageView, adjustViewBounds = true заставит его также изменить размер ImageView, чтобы он был прямоугольным. Затем это влияет на то, как другие представления располагаются вокруг ImageView.
Затем, как написал Самух, вы можете изменить способ масштабирования изображений по умолчанию с помощью параметра android:scaleType . Кстати, самый простой способ узнать, как это работает, — это немного поэкспериментировать! Просто не забудьте посмотреть макеты в самом эмуляторе (или на реальном телефоне), поскольку предварительный просмотр в Eclipse обычно неверен.
Установите для этого параметра значение true, если вы хотите, чтобы ImageView настраивал свои границы для сохранения соотношения сторон его возможности рисования.
Всем, у кого есть эта конкретная проблема. У вас есть ImageView , ширина которого должна быть fill_parent , а высота пропорционально масштабируется:
Добавьте эти два атрибута в свой ImageView :
И установите ширину ImageView на fill_parent и высоту на wrap_content .
Кроме того, если вы не хотите, чтобы ваше изображение было обрезано, попробуйте следующее:
Если вам нужен ImageView , который масштабируется вверх и вниз при сохранении правильного соотношения сторон, добавьте это в свой XML:
Добавьте это к своему коду:
Мне потребовалось некоторое время, чтобы это заработало, но, похоже, это работает в тех случаях, когда изображение меньше ширины экрана и больше ширины экрана, и оно не блокирует изображение.
Источник
Как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон
В Android я определил ImageView ‘s layout_width как fill_parent (который занимает всю ширину телефона).
Если изображение, которое я поместил в ImageView , больше, чем layout_width , Android масштабирует его, верно? Но как насчет высоты? Когда Android масштабирует изображение, оно сохранит соотношение сторон?
Я обнаружил, что в верхней и нижней части ImageView есть некоторое пустое пространство, когда Android масштабирует изображение, которое больше, чем ImageView . Это правда? Если да, как я могу устранить этот пробел?
Да, по умолчанию Android уменьшит изображение до размера ImageView, сохраняя соотношение сторон. Однако убедитесь, что вы устанавливаете изображение в ImageView, используя Android:src=»https://www.it-swarm.com.ru/ru/android/kak-masshtabirovat-izobrazhenie-v-imageview-chtoby-sohranit-sootnoshenie-storon/968225287/» вместо Android:background=». » . src= позволяет масштабировать изображение с сохранением пропорций, а background= — масштабировать и искажать изображение, чтобы оно точно соответствовало размеру ImageView. (Вы можете использовать фон и источник одновременно, что может быть полезно для таких вещей, как отображение рамки вокруг основного изображения, используя только один ImageView.)
Вы также должны увидеть Android:adjustViewBounds , чтобы ImageView изменил свой размер в соответствии с масштабированным изображением. Например, если у вас есть прямоугольное изображение в том, что обычно было бы квадратным ImageView, AdjustViewBounds = true заставит его изменить размеры ImageView, чтобы быть также прямоугольным. Это затем влияет на то, как другие представления расположены вокруг ImageView.
Затем, как написал Самух, вы можете изменить способ масштабирования изображений по умолчанию с помощью параметра Android:scaleType . Кстати, самый простой способ узнать, как это работает, было бы просто немного поэкспериментировать! Только не забудьте взглянуть на макеты в самом эмуляторе (или на реальном телефоне), так как предварительный просмотр в Eclipse обычно неверен.
Установите для этого параметра значение true, если вы хотите, чтобы ImageView корректировал свои границы, чтобы сохранить соотношение сторон для рисования.
Для всех, кто имеет эту конкретную проблему. У вас есть ImageView (или другой View ), который вы хотите иметь ширину fill_parent и пропорционально масштабированную высоту:
Добавьте эти два атрибута в ваш ImageView :
И установите ширину ImageView равной fill_parent , а высоту wrap_content .
Кроме того, если вы не хотите, чтобы ваше изображение было обрезано, попробуйте это:
Если вам нужна переменная ImageView , которая одновременно масштабируется и увеличивается при сохранении правильного соотношения сторон, добавьте это в свой XML:
Добавьте это к своему коду:
Мне потребовалось некоторое время, чтобы заставить это работать, но это, кажется, работает в случаях, когда изображение меньше, чем ширина экрана, и больше, чем ширина экрана, и оно не упаковывает изображение.
Источник
Поместите изображение в ImageView, сохраните соотношение сторон, а затем измените размер ImageView на размеры изображения?
как поместить изображение случайного размера в ImageView ?
Когда:
- изначально ImageView размеры 250dp * 250dp
- больший размер изображения должен быть масштабирован вверх / вниз до 250dp
- изображение должно сохранять соотношение сторон
- на ImageView размеры должны соответствовать размерам изображение после масштабирования
Е. Г. для изображения 100*150, изображения и ImageView должно быть 166*250.
Е. Г. для изображения 150*100, изображения и ImageView должно быть 250*166.
если я установлю границы как
изображения правильно вписываются в ImageView , а ImageView всегда 250dp * 250dp.
13 ответов
(ответ был сильно изменен после разъяснений к исходному вопросу)
после разъяснения:
Это невозможно сделать только в xml. Невозможно масштабировать как изображение, так и ImageView Так что одно измерение изображения всегда будет 250dp и ImageView будет иметь те же размеры, что и изображение.
этот код весы Drawable на ImageView чтобы остаться в квадрате, как 250dp x 250dp с одним размером ровно 250dp и сохранением соотношения сторон. Тогда ImageView изменяется в соответствии с размерами масштабировать изображения. Код используется в действии. Я протестировал его с помощью обработчика нажатия кнопки.
код xml для ImageView :
обновление 7 ноября 2012:
Добавлена проверка нулевого указателя, как предложено в комментариях
может не быть ответом на этот конкретный вопрос, но если кто-то, как и я, ищет ответ, как соответствовать изображению в ImageView с ограниченным размером (например, maxWidth ) сохраняя соотношение сторон, а затем избавляясь от избыточного пространства, занятого ImageView, самым простым решением является использование следующих свойств в XML:
Источник