Как растянуть изображение android studio

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.

Источник

Android: Как растянуть изображение до ширины экрана при сохранении соотношения сторон?

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

17 ответов

Я выполнил это с помощью пользовательского представления. Установите layout_width= «fill_parent»и layout_height=» wrap_content » и укажите на соответствующий drawable:

в конце концов, я сгенерировал размеры вручную, что отлично работает:

Я только что прочитал исходный код для ImageView и это в основном невозможно без использования решений подклассов в этом потоке. В ImageView.onMeasure мы добираемся до этих строк:

здесь h и w размеры изображения, и p* — это обивка.

Итак, если у вас есть layout_height=»wrap_content» он будет ставить widthSize = w + pleft + pright , или другими словами, максимальная ширина равна ширине изображения.

это означает это если вы не установите точный размер, изображения никогда не увеличиваются. Я считаю, что это ошибка, но удачи получить Google, чтобы заметить или исправить это. Edit: есть мои собственные слова, я представил сообщение об ошибке и они говорят, что это было исправлено в будущем выпуске!

другое решение

вот еще один подкласс обходного пути, но вы должны (теоретически, я действительно не проверял его много!) быть возможность использовать его в любом месте вы ImageView . Чтобы использовать его set layout_width=»match_parent» и layout_height=»wrap_content» . Это тоже гораздо более общее, чем принятое решение. Е. Г. вы можете сделать посадку на высоте так же как ширина.

Читайте также:  Doc view для android

настройки adjustViewBounds true и через группу схема расположения. вид очень хорошо работал для меня. Нет необходимости подкласса или просить метрики устройства:

Я боролся с этой проблемой в той или иной форме в течение веков, спасибо, спасибо, спасибо. 🙂

Я просто хотел указать, что вы можете получить обобщаемое решение из того, что сделал Боб Ли, просто расширяя представление и переопределяя onMeasure. Таким образом, вы можете использовать это с любым drawable вы хотите, и он не сломается, если нет изображения:

в некоторых случаях эта волшебная формула прекрасно решает проблему.

для тех, кто борется с этим из другой платформы «размер и форма, чтобы соответствовать» опция обрабатывается красиво в Android, но это трудно найти.

вы обычно хотите эту комбинацию:

  • ширина матча родитель,
  • содержание обруча высоты,
  • adjustViewBounds включен (sic)
  • масштаб fitCenter
  • cropToPadding OFF (sic)

тогда это автоматически и удивительно.

Если вы разработчик iOS, это совершенно удивительно, как просто вы можете сделать «полностью динамические высоты ячеек» в виде таблицы .. я имею в виду ListView. Наслаждаться.

Я сделал это с этими значениями в LinearLayout:

мне удалось достичь этого, используя только этот XML-код. Возможно, eclipse не отображает высоту, чтобы показать, что она расширяется, чтобы соответствовать; однако, когда вы фактически запускаете это на устройстве, он правильно отображает и обеспечивает желаемый результат. (ну по крайней мере для меня)

все делают это программно, поэтому я подумал, что этот ответ идеально подойдет здесь. Этот код работал для моего в xml. Я еще не думал о соотношении, но все же хотел разместить этот ответ, если это кому-то поможет.

очень простое решение-просто использовать функции, предоставляемые RelativeLayout .

вот xml, который делает возможным со стандартным Android Views :

фокус в том, что вы устанавливаете ImageView чтобы заполнить экран, но он должен быть выше других слоев. Таким образом, вы достигаете всего, что вам нужно.

его просто параметр adjustViewBounds=»true» и scaleType=»fitCenter» в XML-файле для ImageView!

Примечание: layout_width установлено значение match_parent

вы устанавливаете ScaleType в ScaleType.FIT_XY. Согласно javadocs, это растянет изображение, чтобы соответствовать всей области, изменяя соотношение сторон, если это необходимо. Это объясняет поведение, которое вы видите.

чтобы получить поведение, которое вы хотите. FIT_CENTER, FIT_START или FIT_END близки, но если изображение уже, чем оно высокое, оно не начнет заполнять ширину. Вы можете посмотреть, как они реализованы, и вы должны возможно, удастся выяснить, как настроить его для ваших целей.

ScaleType.CENTER_CROP будет делать то, что вы хотите: растянуть на всю ширину и масштабировать высоту соответственно. если уменьшенная высота превышает пределы экрана, изображение будет обрезано.

посмотрите, есть гораздо более простое решение вашей проблемы:

Читайте также:  Лучшие спортивные трекеры для андроид

вы можете использовать my StretchableImageView сохранение соотношения сторон (по ширине или по высоте) в зависимости от ширины и высоты drawable:

для меня android: scaleType= «centerCrop» не решил мою проблему. Это на самом деле расширило изображение. Поэтому я попробовал с android: scaleType= «fitXY», и он отлично работал.

это работает нормально в соответствии с моим требованием

Источник

Android: как растянуть изображение до ширины экрана при сохранении соотношения сторон?

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

Я сделал это с помощью специального представления. Установите layout_width = «fill_parent» и layout_height = «wrap_content» и укажите его на соответствующий объект для рисования:

В конце концов, я сгенерировал размеры вручную, что отлично работает:

Я просто прочитал исходный код, ImageView и это в принципе невозможно без использования решений для создания подклассов в этом потоке. В ImageView.onMeasure мы получаем эти строки:

Где h и w — размеры изображения, а p* — отступ.

Таким образом, если у вас есть, layout_height=»wrap_content» он будет установлен widthSize = w + pleft + pright , или, другими словами, максимальная ширина равна ширине изображения.

Это означает, что если вы не установите точный размер, изображения НИКОГДА не увеличиваются . Я считаю это ошибкой, но удачи, чтобы Google заметил или исправил ее. Изменить: Я сам написал отчет об ошибке, и они говорят, что он будет исправлен в следующем выпуске!

Другое решение

Вот еще один подкласс обходного пути, но вы должны (теоретически, я особо не тестировал его!) Иметь возможность использовать его где угодно ImageView . Чтобы использовать его, установите layout_width=»match_parent» , и layout_height=»wrap_content» . Это гораздо более общее решение, чем принятое решение. Например, вы можете подгонять как по высоте, так и по ширине.

Источник

Как автоматически изменить размер изображения для разных размеров экрана Android Studio?

Я начинаю разрабатывать приложения для устройств Android с помощью Android Studio. Пока я тестировал свое приложение на совместимость по размеру экрана, я заметил, что изображения не меняют размер изображения автоматически.

Расположение изображения выглядит совершенно по-разному на разных размерах экрана. Если экран достаточно мал, изображение иногда будет размещено за пределами области видимости.

Я просмотрел весь интернет, но меня немного смущает вопрос о том, как сделать приложение совместимым с большинством размеров экрана (не считая планшетов). Я пошел на сайт Android, и они сказали, чтобы использовать wrap_content. но если я использую это, я не смогу отрегулировать высоту и ширину изображения в соответствии с тем, как я этого хочу.

Кто-нибудь знает, как сделать автоматическое изменение размера изображения в соответствии с размером экрана?

Вот изображения того, что происходит:

Это макет приложения:

Вот как я хочу, чтобы это выглядело (пиксель 3):

Но вот так это выглядит на меньшем экране (Nexus 5):

В XCode есть функция, называемая auto-resize, которая автоматически изменяет размер контента для вас. Есть ли в андроид студии нечто подобное?

Источник

Оцените статью