Как заставить ConstraintLayout работать с процентными значениями?

207

С Preview 1 Android Studio 2.2 Google выпустил новую компоновку в библиотеке поддержки: ConstraintLayout. С ConstraintLayout проще использовать инструмент «Дизайн» в Android Studio, но я не нашел способа использовать относительные размеры (проценты или «веса», как в LinearLayout). Есть ли способ определить ограничения на основе процентов? Например, сделать вид занимающим 40% экрана, создать 20% поля между видами, установить ширину вида на 50% ширины другого вида?

Юрий Федоров
источник
3
Поддержка процента для ширины или высоты была добавлена ​​в version 1.1ConstraintLayout. См. «Процентное измерение» на developer.android.com/reference/android/support/constraint/… или некоторые новые ответы.
sunadorer

Ответы:

225

В настоящее время вы можете сделать это несколькими способами.

Одним из них является создание направляющих (щелкните правой кнопкой мыши область дизайна, затем нажмите «Добавить вертикальную / горизонтальную направляющую»). Затем вы можете щелкнуть «заголовок» руководства, чтобы изменить позиционирование на процентное соотношение. Наконец, вы можете ограничить взгляды руководящими принципами.

Другим способом является позиционирование вида с использованием смещения (в процентах), а затем привязка других видов к этому виду.

Тем не менее, мы думали о том, как предложить процентные измерения. Я не могу давать никаких обещаний, но мы хотели бы добавить это.

Ромэн Гай
источник
1
0 голосов вниз Могу ли я попросить продолжить? Я пытаюсь установить ImageView на 60% ширины, но поддерживаю соотношение сторон 16: 9. Я хочу, чтобы ширина была фиксированной, но высота ImageView была динамической. Это возможно с ConstraintLayout? Я изо всех сил пытаюсь заставить это работать - я заканчиваю с фиксированными значениями ширины / высоты 0, если я не указываю жестко закодированные размеры.
MattWilliams89
3
@ MattWilliams89 Существует параметр с именем layout_constraintDimensionRatio, я думаю, он может быть полезен в вашем случае, напишите здесь «16: 9». Мне не удалось создать свой макет с его помощью, но изображение становится огромным
Юрий Федоров
1
@RomainGuy как вы меняете позиционирование в процентах в заголовке руководящих принципов? Я попытался щелкнуть правой кнопкой мыши по нему, и ничего не появляется
Edijae Crusar
21
Для тех, кто интересуется, что именно является заголовком руководства, это круг со стрелкой вверх или вниз или символ процента. Нажатие переключает между app: layout_constraintGuide_begin, app: layout_constraintGuide_end и app: layout_constraintGuide_percent в XML. Я столкнулся с небольшой проблемой (в ConstraintLayout версии 1.0.0-alpha8, где мне приходилось нажимать на направляющую, удерживать мышь и перетаскивать на круг, чтобы переключать их в редакторе, но я уверен, что эта ошибка будет исправлена ​​в ближайшее время .
Люстиг
4
Вы также можете установить это в XML макета, используяapp:layout_constraintGuide_percentage
piratemurray
215

Это может быть полезно иметь краткую ссылку здесь.

Размещение просмотров

Используйте руководство с app:layout_constraintGuide_percentтаким образом:

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5"/>

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

или

Используйте смещение с app:layout_constraintHorizontal_biasи / или app:layout_constraintVertical_biasдля изменения местоположения просмотра, когда доступное пространство позволяет

<Button
    ...
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintHorizontal_bias="0.25"
    ...
    />

Размер просмотров

Другим процентным значением является высота и / или ширина элементов, с app:layout_constraintHeight_percentи / или app:layout_constraintWidth_percent:

<Button
    ...
    android:layout_width="0dp"
    app:layout_constraintWidth_percent="0.5"
    ...
    />
Амир Увал
источник
3
почему ширина равна 1 дп?
user924
1
@ user924 Было бы разумно дать руководству ширину 0dp, я не знаю, почему разработчики, которые реализовали это, выбрали 1dp. Возможно, потому что 0dp рассматривается как «растяжение» при использовании весов.
Амир Увал
3
@ user924: 0dpиспользуется в ConstraintLayout для указания динамического размера. См developer.android.com/reference/android/support/constraint/...
серв-вкл
1
@ serv-inc, но здесь 1dp, нет 0dp.. это то, о чем я говорю
user924
3
@ user924: вам нужно установить ширину. 0dpуже зарезервировано, так что 1dpкажется разумным.
серв-ин
109

Начиная с «ConstraintLayout1.1.0-beta1» вы можете использовать проценты для определения ширины и высоты.

android:layout_width="0dp"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent=".4"

Это определит ширину, равную 40% ширины экрана. Комбинация этого и руководящих указаний в процентах позволяет вам создать любой макет на основе процентов, который вы хотите.

hoford
источник
6
В макете ограничения 1.0.2 процентное значение для layout_constraintWidth_default не поддерживается. Я думаю, что правильный путь - это использовать Руководство.
vovahost
1
он работает с Android Studio 3.0 построен на 20 октября 2017 года
douarbou
5
Как указано в ответе, это было добавлено в version 1.1ConstraintLayout. На _default="percent"стабильной версии больше не нужно! См «Процентное измерение» на developer.android.com/reference/android/support/constraint/...
sunadorer
@hoford, для представления, содержащего текст, размер которого определяется в spединицах, как размер текста может быть автоматически пропорционален размеру представления (который сам по себе определяется пропорционально общему размеру макета, то есть в процентах) ?
Блаженство
77

С новым выпуском ConstraintLayout v1.1 вы можете сделать следующее:

<Button
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintHeight_percent="0.2"
app:layout_constraintWidth_percent="0.65" />

Это ограничит кнопку на 20% высоты и 65% ширины родительского вида.

Адам
источник
1
у меня сработало только когда я перешел с "android:" на "app:" -> app: layout_constraintHeight_percent = "0.2"
Кирилл Кармазин
Это необходимо для меня, когда я следую за текучим дизайном материала. material.io/design/layout/...
@ Adam, для представления, содержащего текст, размер которого должен быть определен в spединицах, как размер текста может быть автоматически пропорционален размеру представления (который сам по себе определяется пропорционально общему размеру макета, то есть в процентах) ?
Блаженство
1
@ Блисс Похоже, это может помочь: developer.android.com/guide/topics/ui/look-and-feel/… Хотя я никогда не использовал его сам.
Адам
43

Как пользоваться Руководством

В принятом ответе немного неясно, как использовать руководящие принципы и что такое «заголовок».

меры

Сначала добавьте Руководство.

введите описание изображения здесь

Выберите Guidline или переместите его немного, чтобы сделать ограничения видимыми.

введите описание изображения здесь

Затем нажимайте на круглый круг («заголовок»), пока он не станет процентным. Затем вы можете перетащить этот процент до 50% или как хотите.

введите описание изображения здесь

После этого вы можете ограничить свой вид Руководством, чтобы сделать его некоторым процентом от родителя (используя match_constraintв представлении).

введите описание изображения здесь

Suragch
источник
Где должен быть виден «заголовок»? Это не проявляется на мой взгляд.
Marcel50506
@ Marcel50506, убедитесь, что отображаются оба вида: Design и Blueprint. Это даст вам лучший шанс увидеть это. Если вы видите направляющую линию, попробуйте щелкнуть по ней, чтобы выбрать ее. Если вы не видите линию, попробуйте щелкнуть элемент направляющей в меню «Дерево компонентов», который должен быть с левой стороны (при условии, что вы уже добавили направляющую).
Сурагч
1
Я не вижу кружок, но, нажимая слева от направляющей, я могу изменить его на проценты. Думаю, проблема с визуализацией. Спасибо.
Marcel50506
Это лучший ответ, потому что он предлагает лучший подход макета. Мы можем выровнять несколько представлений по базовому принципу вместо добавления процента только для одного представления
Нгуен Минь Хиен
33

Руководство бесценно - и app: layout_constraintGuide_percent - отличный друг ... Однако иногда нам нужны проценты без рекомендаций. Теперь можно использовать веса :

android:layout_width="0dp"
app:layout_constraintHorizontal_weight="1"

Вот более полный пример, который использует руководство с дополнительными весами :

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context="android.itomerbu.layoutdemo.MainActivity">

    <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.44"/>

    <Button
        android:id="@+id/btnThird"
        android:layout_width="0dp"
        app:layout_constraintHorizontal_weight="1"
        android:layout_height="wrap_content"
        android:text="@string/btnThird"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginBottom="8dp"
        app:layout_constraintRight_toLeftOf="@+id/btnTwoThirds"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"/>

    <Button
        android:id="@+id/btnTwoThirds"
        app:layout_constraintHorizontal_weight="2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="@string/btnTwoThirds"
        app:layout_constraintBottom_toBottomOf="@+id/btnThird"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/btnThird"/>
</android.support.constraint.ConstraintLayout>
TomerBu
источник
2
@Plumbus - Веса эквивалентны процентам (любой процент может быть математически преобразован в вес и наоборот). Будучи придирчивым к терминологии, вы упускаете суть ответа.
Скотт Биггс
11

При использовании ConstraintLayout v1.1.2 для измерения следует установить значение, 0dpа затем для атрибутов layout_constraintWidth_percentor layout_constraintHeight_percentустановить значение от 0 до 1, например:

<!-- 50% width centered Button -->
<Button
    android:id="@+id/button"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintWidth_percent=".5" />

(Вам не нужно устанавливать app:layout_constraintWidth_default="percent"или app:layout_constraintHeight_default="percent"с ConstraintLayout 1.1.2 и последующими версиями)

Бубу
источник
10

Constraint Layout 1.0 заставляет представление занимать процент экрана, требуемого, делая два руководства. В Constraint Layout 1.1 это было сделано проще, позволяя вам легко ограничить любое представление шириной или высотой в процентах.

введите описание изображения здесь

Разве это не фантастика? Все представления поддерживают атрибуты layout_constraintWidth_percent и layout_constraintHeight_percent. Это приведет к тому, что ограничение будет зафиксировано в процентах от доступного пространства. Таким образом, расширение Button или TextView до процента экрана может быть выполнено с помощью нескольких строк XML.

Например, если вы хотите установить ширину кнопки на 70% экрана, вы можете сделать это следующим образом:

<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_constraintWidth_percent="0.7" />

Обратите внимание, что вам нужно будет указать, что размер должен использоваться в процентах от 0dp, как мы указали для android: layout_width to 0dp выше.

Точно так же, если вы хотите установить высоту кнопки на 20% экрана, вы можете сделать это следующим образом:

<Button
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_constraintHeight_percent="0.2" />

Видеть! на этот раз мы указали для android: layout_height значение 0dp, поскольку хотим, чтобы кнопка использовала высоту в процентах.

Ашиш Сатпут
источник
8

Попробуйте этот код. Вы можете изменить процент высоты и ширины с помощью app: layout_constraintHeight_percent и app: layout_constraintWidth_percent.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#FF00FF"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHeight_percent=".6"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_percent=".4"></LinearLayout>

</android.support.constraint.ConstraintLayout>

Gradle:

dependencies {
...
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
}

введите описание изображения здесь

живи любя
источник
7

Вы можете использовать app:layout_constraintVertical_weightего так же, как layout_weightвlinearlayout

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
    android:id="@+id/button4"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/button5"
    app:layout_constraintVertical_weight="1"/>

<Button
    android:id="@+id/button5"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintLeft_toRightOf="@+id/button4"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintVertical_weight="1"/>
</android.support.constraint.ConstraintLayout>

ПРИМЕЧАНИЕ: app:layout_constraintVertical_weight( app:layout_constraintHorizontal_weight) будет работать с android:layout_width="0dp"(android:layout_height="0dp"

vuhung3990
источник
5

Для кого-то, кто может оказаться полезным, вы можете использовать layout_constraintDimensionRatioim любого дочернего представления внутри a, ConstraintLayoutи мы можем определить высоту или ширину как отношение другого измерения (по крайней мере, одно должно быть 0dp ширина или высота) пример

 <ImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:src="@drawable/top_image"
        app:layout_constraintDimensionRatio="16:9"        
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

в этом случае соотношение сторон 16: 9 app:layout_constraintDimensionRatio="16:9" вы можете найти больше информации ЗДЕСЬ

Хавьер
источник
3

Я знаю, что это не то, о чем изначально изначально просил OP, но это очень помогло мне в этой ситуации, когда у меня был похожий вопрос. Добавление этого для людей, желающих изменить размер окна макета (который я использую регулярно), с помощью кода , Добавьте это к вашему onCreate в активности вопроса. (Изменяет до 80%)

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);

int width = dm.widthPixels;
int height = dm.heightPixels;

getWindow().setLayout((int)(width * 0.8), (int)(height * 0.8));
Дэвид Аззи
источник
2

Просто замените в своем теге

app:layout_constraintGuide_begin="291dp"

с участием

app:layout_constraintGuide_percent="0.7"

где 0,7 означает 70%.

Также, если вы сейчас попытаетесь перетащить направляющие, перетаскиваемое значение будет отображаться в% age.

Удит Капахи
источник
2

Используя рекомендации, вы можете изменить позиционирование в процентах

<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="1dp"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"/>

Вы также можете использовать этот способ

android:layout_width="0dp"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.4"
Ашиш Сатпут
источник