У меня есть изображение. Я хочу, чтобы его ширина была fill_parent. Я хочу, чтобы его высота равнялась ширине. Например:
<ImageView
android:layout_width="fill_parent"
android:layout_height="whatever the width ends up being" />
Возможно ли что-то подобное в файле макета без необходимости создавать собственный класс представления?
Спасибо
Ответы:
Обновление: 14 сентября 2017
Согласно комментарию ниже, библиотека поддержки процентов устарела начиная с библиотеки поддержки Android 26.0.0. Это новый способ сделать это:
Смотри здесь
Запрещены:
Согласно этому сообщению разработчиков Android, все, что вам нужно сделать сейчас, это обернуть все, что вы хотите, в PercentRelativeLayout или PercentFrameLayout, а затем указать его отношения, например, так
источник
Может быть, это ответит на ваш вопрос:
Вы можете игнорировать
scaleType
атрибут для этой конкретной ситуации.источник
Это можно сделать с помощью LayoutParams, чтобы динамически установить высоту представлений, когда вы знаете ширину представлений во время выполнения. Вам нужно использовать поток Runnable, чтобы получить ширину представлений во время выполнения, иначе вы будете пытаться установить высоту до того, как узнаете ширину представления, поскольку макет еще не нарисован.
Пример того, как я решил свою проблему:
LayoutParams должен относиться к типу родительского представления, в котором находится ваше представление. Мой FrameLayout находится внутри RelativeLayout в xml-файле.
вызывается, чтобы заставить представление перерисовываться, находясь в отдельном потоке, чем поток пользовательского интерфейса
источник
onMeasure
, как показано в ответе Региса . Ответом , но только для представлений, представленных через адаптер, например, изнутриGridView
, является ответ Мэтта .requestLayout()
после установки параметров. с чего бы это?Я не смог получить ответ Дэвида Чу для работы с элементом RecyclerView и понял, что мне нужно ограничить ImageView для родителя. Установите ширину ImageView
0dp
и ограничьте его начало и конец родительским. Я не уверен, что установка шириныwrap_content
илиmatch_parent
работает в некоторых случаях, но я думаю, что это лучший способ получить дочерний элемент ConstraintLayout для заполнения его родителя.источник
Вот что я сделал, чтобы ImageButton всегда имел ширину, равную его высоте (и избегал глупых пустых полей в одном направлении ... что я считаю ошибкой SDK ...):
Я определил класс SquareImageButton, который выходит из ImageButton:
Вот мой XML:
Работает как шарм!
источник
Если ваш вид изображения находится внутри макета ограничения, вы можете использовать следующие ограничения для создания квадратного вида изображения
источник
В Android 26.0.0 PercentRelativeLayout устарела .
Лучший способ решить эту проблему теперь
ConstraintLayout
так:Вот учебник о том, как добавить
ConstraintLayout
в свой проект.источник
Вы не можете сделать это только с макетом, я пытался. Я закончил тем, что написал очень простой класс для обработки, вы можете проверить это на github. SquareImage.java Это часть более крупного проекта, но ничего, что можно скопировать и вставить не удается (лицензировано под Apache 2.0)
По сути, вам просто нужно установить высоту / ширину, равную другому измерению (в зависимости от того, как вы хотите его масштабировать)
Примечание. Вы можете сделать его квадратным без пользовательского класса, используя
scaleType
атрибут, но границы представления выходят за пределы видимого изображения, что создает проблему, если вы размещаете рядом другие представления.источник
Чтобы установить ImageView равным половине экрана, вам нужно добавить следующее в ваш XML для ImageView:
Чтобы затем установить высоту, равную этой ширине, вам нужно сделать это в коде. В
getView
методе вашегоGridView
адаптера установитеImageView
высоту, равную его измеренной ширине:источник
Для людей, проходящих мимо, в 2017 году, новый лучший способ добиться того, чего вы хотите, - это использовать ConstraintLayout, например:
И не забудьте добавить ограничения для всех четырех направлений в соответствии с вашими требованиями.
Создайте адаптивный интерфейс с ConstraintLayout
Кроме того, к настоящему времени PercentRelativeLayout устарел (см. Документацию Android ).
источник
Вот как я решил эту проблему:
Предварительный просмотр - imageView с шириной, установленной в «match_parent» и scaleType в «cropCenter»
picture - Растровый объект для установки в imageView src.
Это работает очень хорошо для меня.
источник
= vw*ph/pw
а не проще= vw
. (Я думаю , что вы делаете это , чтобы сохранить пропорции исходного изображения, а не силу квадратный предварительный просмотр.)Я не думаю, что есть какой-то способ сделать это в файле макета XML, и я не думаю, что
android:scaleType
атрибут будет работать так, как вы этого хотите.Единственным способом было бы сделать это программно. Вы можете установить ширину fill_parent и либо принять ширину экрана в качестве высоты,
View
либо использоватьView.getWidth()
метод.источник
Функция ImageView «scaleType» может помочь вам в этом.
Этот код сохранит соотношение сторон и разместит изображение сверху:
Вот отличный пост, показывающий возможности и возможности использования scaleType.
Образцы ImageView scaleType
источник
мне так понравилось -
источник