Я хочу загрузить изображение (неизвестного размера, но всегда примерно квадратного) и отобразить его так, чтобы оно заполняло экран по горизонтали и растягивалось по вертикали для сохранения соотношения сторон изображения при любом размере экрана. Вот мой (нерабочий) код. Он растягивает изображение по горизонтали, но не по вертикали, поэтому оно сжимается ...
ImageView mainImageView = new ImageView(context);
mainImageView.setImageBitmap(mainImage); //downloaded from server
mainImageView.setScaleType(ScaleType.FIT_XY);
//mainImageView.setAdjustViewBounds(true);
//with this line enabled, just scales image down
addView(mainImageView,new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
Ответы:
Я сделал это с помощью специального представления. Установите 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"
. Это гораздо более общее решение, чем принятое решение. Например, вы можете подгонять как по высоте, так и по ширине.источник
Установка для adjustViewBounds значения true и использование группы представлений LinearLayout сработали для меня очень хорошо. Нет необходимости создавать подклассы или запрашивать показатели устройства:
источник
Я боролся с этой проблемой в той или иной форме для AGES, спасибо, спасибо, СПАСИБО .... :)
Я просто хотел указать, что вы можете получить обобщаемое решение из того, что сделал Боб Ли, просто расширив View и переопределив onMeasure. Таким образом, вы можете использовать это с любым чертежом, которое хотите, и оно не сломается, если нет изображения:
источник
В некоторых случаях эта волшебная формула прекрасно решает проблему.
Для тех, кто борется с этим на другой платформе, опция «размер и форма» прекрасно реализована в Android, но ее трудно найти.
Обычно вам нужна такая комбинация:
Тогда это автоматически и потрясающе.
Если вы разработчик iOS, совершенно удивительно, как просто в Android вы можете делать «полностью динамические высоты ячеек» в табличном представлении ... эээ, я имею в виду ListView. Наслаждаться.
источник
Мне удалось добиться этого, используя только этот XML-код. Может случиться так, что eclipse не отображает высоту, чтобы показать, что она расширяется, чтобы соответствовать; однако, когда вы действительно запускаете это на устройстве, он правильно отображает и обеспечивает желаемый результат. (ну по крайней мере для меня)
источник
src
и ImageView стал пропорциональным.Я сделал это с этими значениями в LinearLayout:
источник
Все делают это программно, поэтому я подумал, что этот ответ здесь идеально подходит. Этот код работал у меня в 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 будет делать то, что вы хотите: растягивать до полной ширины и соответственно масштабировать высоту. если масштабированная высота превышает пределы экрана, изображение будет обрезано.
источник
Посмотрите, есть гораздо более простое решение вашей проблемы:
источник
Вы можете использовать мой StretchableImageView, сохраняя соотношение сторон (по ширине или по высоте) в зависимости от ширины и высоты чертежа:
источник
Для меня android: scaleType = "centerCrop" не решил мою проблему. Это на самом деле еще больше расширило изображение. Я попробовал с android: scaleType = "fitXY", и он отлично сработал.
источник
Это работает нормально в соответствии с моим требованием
<ImageView android:id="@+id/imgIssue" android:layout_width="fill_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY"/>
источник