- ImageView
- Общая информация
- Метод setImageResource()
- Метод setImageBitmap()
- Метод setImageDrawable()
- Метод setImageURI()
- Другие методы
- Масштабирование через свойство Scale Type
- Атрибут android:adjustViewBounds=»true»
- Загрузка изображения из галереи
- Получить размеры ImageView — будьте осторожны
- Копирование изображений между ImageView
- Примеры
- Как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон
- Изменение размера ImageView в пределах TableLayout программно
- 1 ответ
- Похожие вопросы:
- Установить ширину и высоту ImageView программно?
- Как задать относительный размер ImageView?
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, я определил 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:adjustViewBounds должны убедиться, что ImageView изменяет свой размер в соответствии с масштабированным изображением. Например, если у вас есть прямоугольное изображение в том, что обычно было бы квадратным ImageView, AdjustViewBounds = true заставит его изменить размеры ImageView, чтобы быть также прямоугольным. Это затем влияет на то, как другие представления расположены вокруг ImageView.
Затем, как написал Самух, вы можете изменить способ масштабирования изображений по умолчанию с помощью android:scaleType параметра. Кстати, самый простой способ узнать, как это работает, было бы просто немного поэкспериментировать! Только не забудьте взглянуть на макеты в самом эмуляторе (или на реальном телефоне), так как предварительный просмотр в Eclipse обычно неверен.
Источник
Изменение размера ImageView в пределах TableLayout программно
Если у меня есть структура TableLayout (ниже), которая определяет 2 ImageViews. Тот, который также указывает значения пикселей для width/height., работает так, как я и ожидал — Pic one изменяется до 50 пикселей, а pic2 сохраняется в исходном размере:
Но мне действительно нужно сделать все это программно, поэтому я делаю это так...
Вышеизложенное не делает того же самого, что и XML — первый ImageView вообще не показывает использование программного способа после добавления к нему метода setLayoutParams().
Я, должно быть, что-то упускаю здесь, что же это такое, что отличается?
1 ответ
Я пытался получить ImageView и 3 кнопки одного размера (соответствующие родительскому TableLayout), но для меня это оказалось невозможным, и я надеялся, что кто-то сможет помочь мне исправить эту проблему в файле .xml. http://i.imgur.com/xgsIC.png Это TableLayout, который я пытаюсь собрать вместе.
Хорошо, мне удалось решить эту проблему. Вместо использования:
Я использовал это вместо этого:
Похожие вопросы:
Я застрял, пытаясь изменить размер объектов ImageView. Проблема в том, что когда я программно устанавливаю ширину/высоту, я вижу изменение ширины/высоты с помощью инструмента отладчика в eclipse.
Я хочу добавить ImageView в TableLayout. Я все делаю, но мне ничего не показывают. Как я могу это исправить? Это мой код: public void onCreate(Bundle savedInstanceState) <.
Actullay все, что я хочу, — это название вопроса. Я хочу установить фиксированную ширину и высоту для ImageView в TableLayout. Как я могу это сделать? Это мой код: public void onCreate(Bundle.
Я пытался получить ImageView и 3 кнопки одного размера (соответствующие родительскому TableLayout), но для меня это оказалось невозможным, и я надеялся, что кто-то сможет помочь мне исправить эту.
Я ищу несколько дней и не могу найти ответа. Я пытаюсь изменить размер изображения через XML. У меня есть список изображений bitmap, как я могу добавить этот bitmap к tableLayout программно? спасибо. У меня есть ImageView , размер которого я хочу установить программно . Поэтому у меня нет возможности помещать изображения разного размера в соответствующие папки drawable . В принципе, вместо того. У меня есть imageview , который отображает фотографию, сделанную камерой телефона, которая может быть изменена пользователем. Проблема , с которой я сталкиваюсь, заключается в том, что изображение. Источник Как можно программно настроить ширину и высоту ImageView ? Возможно, слишком поздно, но для других, у кого такая же проблема, установить высоту ImageView: Надеюсь это поможет. Важный. Если вы устанавливаете высоту после того, как макет уже «выложен», убедитесь, что вы также вызываете: Если ваше представление изображения динамическое, ответ, содержащий getLayout, завершится ошибкой с исключением. В этом случае правильный путь: Этот простой способ выполнить свою задачу: И другим способом, если вы хотите предоставить размер экрана по высоте и ширине, используйте ниже код: Надеюсь, что вам будет полезно. Я сыграл этот с pixel и dp . Как установить по пикселю : Как установить dp : Надеюсь, это поможет вам. Если вам нужно установить ширину или высоту в match_parent (размером с родительский) или wrap_content (достаточно большой, чтобы соответствовать собственному внутреннему контенту), то ViewGroup.LayoutParams имеет две константы: Или вы можете установить их, как в ответе Хаким Заид: Возвращает значение высоты в пикселях. Сначала необходимо получить размеры экрана, чтобы правильно установить значения. После того, как вы получите размеры экрана, вы можете установить ширину и высоту изображения, используя соответствующие поля. Самый простой и простой способ установки кнопки динамически: Вышеуказанная высота и ширина находятся в пикселях px . 45 – высота в dp, а 42 – ширина в dp . Так, например, если вы разместили свою кнопку в TableRow в TableLayout, вы должны иметь ее как TableRow.LayoutParams Просто создайте объект LayoutParams и назначьте его вашему изображению Вы можете установить значение для всего случая. Источник Как можно указать размер ImageView из кода в DP ImageView и размер файла Размер текстур в ImageView Я бы использовал GridView и с учетом его размеров и расстояний между картинками — высчитывал размеры одной картинки. К тому же, если это галерея, то вероятнее всего пришлось бы подумать над созданием миниатюр изображений и их кешированием. Ну и прочими вещами. Если же это, например, просто менюшка, которая всегда такая и никогда не изменяется. (Где лучше заюзать ImageButton) Если требуется, чтобы они равномерно распределялись по горизонтали, то, находясь в LinearLayout каждой ImageView надо задать layout_width = «0» и равный вес, например layout_weight = «1» Но тут встает другой вопрос, если картинки все таки меняются, то как верстка должна вести себя, если вставлена, например, длиннющая, но низкая или высоченная, но короткая по длине картинка? ИсточникУстановить ширину и высоту ImageView программно?
Как задать относительный размер ImageView?
Как изменить размер ImageView из кода?
Нужно в зависимости от условий рассчитывать и менять высоту изображения ImageView. Так, как.
Здравствуте, подскажите пожалуйста. Как можно указать размер ImageView из кода в DP? И еще: если.
Суть проблемы — на карте размещаются маркеры и хотелось бы в них добавить изображения, но вес.
Здравствуйте, если у меня ImageView размером 79dp x 157dp, то какого размера я должен нарисовать.
То, наверное, проще всего использовать один вертикальный LinearLayout и три вложенных в него горизонтальных LinearLayout, в которых уже будут размещены ImageView с заданными весами.