Imageview 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» вывел картинку без изменений в левом верхнем углу с обрезанными краями.

Читайте также:  Warhammer dark crusade для андроид

Атрибут 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, я определил ImageView «S layout_width быть fill_parent (который занимает всю ширину телефона).

Если изображение, к которому я добавляю, ImageView больше, чем layout_width Android, то его масштабируется, верно? Но как насчет высоты? Когда Android масштабирует изображение, сохранится ли соотношение сторон?

Что я обнаружил, так это то, что в верхней и нижней части экрана есть некоторое пустое пространство, ImageView когда Android масштабирует изображение, которое больше, чем ImageView . Это правда? Если да, как я могу устранить этот пробел?

Да, по умолчанию Android уменьшит изображение до размера ImageView, сохраняя соотношение сторон. Однако убедитесь, что вы устанавливаете изображение в ImageView, используя android:src=»https://qastack.ru/programming/2521959/» вместо android:background=». » . src= позволяет масштабировать изображение с сохранением пропорций, но background= масштабирует и искажает изображение, чтобы оно точно соответствовало размеру ImageView. (Вы можете использовать фон и источник одновременно, что может быть полезно для таких вещей, как отображение рамки вокруг основного изображения, используя только один ImageView.)

Читайте также:  Android сменить аккаунт гугл

Вы также android:adjustViewBounds должны убедиться, что ImageView изменяет свой размер в соответствии с масштабированным изображением. Например, если у вас есть прямоугольное изображение в том, что обычно было бы квадратным ImageView, AdjustViewBounds = true заставит его изменить размеры ImageView, чтобы быть также прямоугольным. Это затем влияет на то, как другие представления расположены вокруг ImageView.

Затем, как написал Самух, вы можете изменить способ масштабирования изображений по умолчанию с помощью android:scaleType параметра. Кстати, самый простой способ узнать, как это работает, было бы просто немного поэкспериментировать! Только не забудьте взглянуть на макеты в самом эмуляторе (или на реальном телефоне), так как предварительный просмотр в Eclipse обычно неверен.

Источник

Как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон

В Android я определил layout_width ImageView как fill_parent (который занимает всю ширину телефона).

Если изображение, которое я помещаю в ImageView , больше, чем layout_width , Android будет масштабировать его, не так ли? Но как насчет высоты? Когда Android масштабирует изображение, сохранит ли соотношение сторон?

Я выяснил, что в верхней и нижней части ImageView есть некоторое свободное пространство, когда Android масштабирует изображение, которое больше, чем ImageView . Это правда? Если да, то как я могу устранить это пустое пространство?

Да, по умолчанию Android будет масштабировать ваше изображение вниз, чтобы соответствовать ImageView, поддерживая соотношение сторон. Однако убедитесь, что вы устанавливаете изображение в ImageView с помощью android:src=»http://www.ohandroid.com/» а не на 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 и height для wrap_content .

Кроме того, если вы не хотите, чтобы ваше изображение было обрезано, попробуйте следующее:

Если вы хотите, чтобы ImageView масштабировался вверх и вниз при сохранении правильного соотношения сторон, добавьте это в свой XML:

Читайте также:  Flutter android sdk version

Добавьте это в свой код:

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

Взгляните на ImageView.ScaleType, чтобы контролировать и понимать способ изменения размера в ImageView . Когда изображение изменяется (при сохранении его соотношения сторон), есть вероятность, что высота или ширина изображения становятся меньше размеров изображения.

Ниже код Работа с масштабированием изображения в виде соотношения сторон:

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

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

Вы можете рассчитать ширину экрана. И вы можете масштабировать растровое изображение.

Рассчитать ширину экрана и масштабированную высоту изображения по ширине экрана.

После того, как вы можете масштабировать растровое изображение.

Используйте эти свойства в ImageView, чтобы сохранить соотношение сторон:

При этом программно не забудьте позвонить сеттерам в правильном порядке:

Это сработало для меня:

Если вы хотите, чтобы ваше изображение занимало максимально возможное пространство, лучшим вариантом было бы

Для любого из вас, кто хочет, чтобы изображение соответствовало точности изображения с правильным масштабированием и без использования обрезки

Где imageView – это представление, представляющее ваш ImageView

Попробуйте использовать android:layout_gravity для ImageView:

Пример выше работал для меня.

У меня есть алгоритм масштабирования растрового изображения для наилучшего определения размеров контейнера, поддерживающего его соотношение сторон. Пожалуйста, найдите мое решение здесь

Надеюсь, это поможет кому-то по переулку!

Yo не нужен какой-либо Java-код. Вам просто нужно:

Ключ находится в родительском матче для ширины и высоты

Источник

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

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

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

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

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

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

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

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

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

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

Источник

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