В макете я хочу масштабировать фоновое изображение (сохраняя его пропорции) до пространства, выделенного при создании страницы. У кого-нибудь есть идеи как это сделать?
Я использую layout.setBackgroundDrawable()
и BitmapDrawable()
для установки gravity
для отсечения и заполнения, но не вижу никакой опции для масштабирования.
Ответы:
Чтобы настроить масштабирование фоновых изображений, создайте такой ресурс:
Тогда он будет центрирован в виде, если используется в качестве фона. Есть и другие флаги: http://developer.android.com/guide/topics/resources/drawable-resource.html
источник
Не пытался делать именно то, что вы хотите, но вы можете масштабировать с помощью ImageView,
android:scaleType="fitXY"
и он будет соответствовать размеру, который вы даете ImageView.
Таким образом, вы можете создать FrameLayout для своего макета, поместить в него ImageView, а затем любой другой контент, который вам нужен в FrameLayout, а также прозрачный фон.
источник
Есть простой способ сделать это из отрисовки:
your_drawable.xml
Единственным недостатком является то, что если места недостаточно, ваше изображение не будет отображаться полностью, но оно будет обрезано, я не смог найти способ сделать это непосредственно из рисованного объекта. Но, судя по тестам, которые я провел, он работает довольно хорошо и не обрезает большую часть изображения. Вы можете больше поиграть с опциями гравитации.
Другой способ - просто создать макет, в котором вы будете использовать
ImageView
и установитьscaleType
значениеfitCenter
.источник
error: <item> must have a 'name' attribute.
Чтобы сохранить соотношение сторон, вы должны использовать
android:scaleType=fitCenter
илиfitStart
т. Д. ИспользованиеfitXY
не сохранит исходное соотношение сторон изображения!Обратите внимание, что это работает только для изображений с
src
атрибутом, но не для фонового изображения.источник
Используйте изображение в качестве фона для макета:
источник
android:scaleType="centerCrop"
работает.Когда вы устанавливаете Drawable для ImageView с помощью
setBackgroundDrawable
метода, изображение всегда будет масштабироваться. Параметры asadjustViewBounds
or differentScaleTypes
будут игнорироваться. Единственное решение сохранить найденное мной соотношение сторон - это изменить размер файлаImageView
после загрузки. Вот фрагмент кода, который я использовал:В приведенном выше фрагменте кода bmp - это объект Bitmap, который должен отображаться, а imageView - это
ImageView
объект.Важно отметить изменение параметров макета . Это необходимо, потому что
setMaxHeight
иsetMaxWidth
будет иметь значение только в том случае, если ширина и высота определены для обертывания содержимого, а не для заполнения родительского элемента. Заливка родителя с другой стороны , это желаемое значение в начале, потому что иначеcontainerWidth
иcontainerHeight
оба будут иметь значения , равные 0. Итак, в вашем файле макета вы будете иметь что - то подобное для вашего ImageView:источник
Это не самое эффективное решение, но, как кто-то предложил вместо фона, вы можете создать FrameLayout или RelativeLayout и использовать ImageView в качестве псевдофона - другие элементы будут расположены прямо над ним:
Проблема с ImageView заключается в том, что доступны только типы scaleTypes: CENTER, CENTER_CROP, CENTER_INSIDE, FIT_CENTER, FIT_END, FIT_START, FIT_XY, MATRIX ( http://etcodehome.blogspot.de/2011/05/android-imageview-scaletype-samples.html). )
и для «масштабирования фонового изображения (сохраняя его соотношение сторон)» в некоторых случаях, когда вы хотите, чтобы изображение заполняло весь экран (например, фоновое изображение), а соотношение сторон экрана отличается от изображения, необходимый scaleType является любезным из TOP_CROP, потому что:
CENTER_CROP центрирует масштабированное изображение вместо выравнивания верхнего края по верхнему краю представления изображения, а FIT_START соответствует высоте экрана и не заполняет ширину. И, как заметила пользователь Анке, FIT_XY не сохраняет соотношение сторон.
К счастью, кто-то расширил ImageView для поддержки TOP_CROP
https://stackoverflow.com/a/14815588/2075875
Теперь ИМХО было бы идеально, если бы кто-нибудь написал собственный Drawable, который так масштабирует изображение. Тогда его можно было бы использовать как параметр фона.
Reflog предлагает предварительно масштабировать drawable перед его использованием. Вот инструкция, как это сделать: Java (Android): Как масштабировать чертеж без растрового изображения? Хотя у него есть недостаток, это масштабируемое изображение / растровое изображение будет использовать больше оперативной памяти, в то время как масштабирование на лету, используемое ImageView, не требует больше памяти. Преимущество могло заключаться в меньшей загрузке процессора.
источник
Код ниже делает растровое изображение идеально с тем же размером изображения. Получите высоту и ширину растрового изображения, а затем вычислите новую высоту и ширину с помощью параметров изображения. Это даст вам необходимое изображение с наилучшим соотношением сторон.
источник
То, что предложил Двибо, работает. Но, по моему скромному мнению, в этом нет необходимости. Фоновый рисунок хорошо масштабируется сам по себе. Вид должен иметь фиксированную ширину и высоту, как в следующем примере:
источник
Один из вариантов, который можно попробовать - поместить изображение в
drawable-nodpi
папку и установить для фона макета идентификатор ресурса с возможностью рисования.Это определенно работает с уменьшением масштаба, хотя я не тестировал масштабирование.
источник
Котлин:
Если вам нужно было нарисовать растровое изображение в представлении, масштабируйте его до FIT.
Вы можете выполнить правильные вычисления, чтобы установить высоту bm, равную контейнеру, и отрегулировать ширину, если отношение ширины bm к высоте меньше, чем отношение ширины контейнера к высоте, или обратное в противоположном сценарии.
Изображений:
источник
вам нужно будет предварительно масштабировать этот чертеж, прежде чем использовать его в качестве фона
источник
Вы можете использовать одно из следующих:
Android: гравитация = "fill_horizontal | clip_vertical"
Или
Android: гравитация = "fill_vertical | clip_horizontal"
источник