Як змусити 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/… або деякі новіші відповіді.
сунадор

Відповіді:


225

Наразі це можна зробити двома способами.

Перший - створити керівні принципи (клацніть правою кнопкою миші область дизайну, потім натисніть кнопку "Додати вертикальну / горизонтальну орієнтир"). Потім ви можете натиснути "заголовок" настанови, щоб змінити позиціювання на відсоток. Нарешті, ви можете обмежити погляди на вказівки.

Інший спосіб - розташувати подання за допомогою зміщення (відсотків), а потім прикріпити інші погляди до цього подання.

Це означає, що ми думали над тим, як запропонувати розміри на основі відсотків. Я не можу обіцяти, але це щось, що ми хотіли б додати.


1
0 голос "вниз" Чи можу я попросити продовження? Я намагаюся встановити ImageView таким, щоб він був шириною 60%, але підтримував співвідношення сторін 16: 9. Я хочу, щоб ширина була фіксованою, але висота ImageView повинна бути динамічною. Чи можливо це за допомогою ConstraintLayout? Я намагаюся, щоб він працював - я закінчую фіксованими значеннями ширини / висоти 0, якщо не вказати твердо кодовані розміри.
MattWilliams89

3
@ MattWilliams89 Є параметр, який називається layout_constraintDimensionRatio, я думаю, він може бути корисним у вашому випадку, напишіть там "16: 9". Мені не вдалося спробувати створити ваш макет, але зображення виходить величезним
Юрій Федоров

1
@RomainGuy, як змінити позиціонування на відсоток у заголовку керівних принципів ?. я намагався клацнути правою кнопкою миші, і нічого не з’являється
Edijae Crusar

21
Для тих, хто цікавиться, що саме заголовок настанови, це коло, яке має стрілку вгору або вниз або символ відсотка. Клацнувши, що перемикає між додатком: layout_constraintGuide_begin, app: layout_constraintGuide_end та програмою: layout_constraintGuide_percent у XML. У мене виникла невелика проблема (на ConstraintLayout версії 1.0.0-alpha8, де мені довелося натиснути настанови, утримувати мишу та перетягнути до кола, щоб переключити їх у редакторі, але я впевнений, що ця помилка буде виправлена ​​незабаром .
lustig

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
чому в нього ширина встановлена ​​на 1dp?
user924

1
@ user924 Було б сенс давати орієнтир шириною 0dp, я не знаю, чому розробники, які реалізували це, вирішили на 1dp. Можливо тому, що 0dp розглядають як "розтягування" при використанні ваг.
Амір Уваль

3
@ user924: 0dpвикористовується в ConstraintLayout для позначення динамічного розміру. Дивіться developer.android.com/reference/android/support/constraint/…
serv-inc

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% від ширини екрана. Поєднання цього та вказівок у відсотках дозволяє створити будь-який макет на основі відсотків, який ви хочете.


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
@Bliss Звучить подібне, це може допомогти: developer.android.com/guide/topics/ui/look-and-feel/… Я сам ніколи цього не використовував.
Адам

43

Як користуватися Правилами

Прийнята відповідь трохи незрозуміла щодо того, як використовувати вказівки та що таке «заголовок».

Кроки

Спочатку додайте Керівництво.

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

Виберіть «Керівну лінію» або трохи перемістіть її, щоб зробити видимі обмеження.

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

Потім клацніть кругле коло («заголовок»), поки воно не стане відсотком. Потім ви можете перетягнути цей відсоток до 50% або що завгодно.

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

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

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


Де має бути видно «заголовок»? На мій погляд, це не відображається.
Marcel50506

@ Marcel50506, переконайтеся, що відображаються як дизайн, так і креслення. Це дасть вам найкращий шанс на можливість бачити це. Якщо ви бачите орієнтир, виберіть його, щоб вибрати його. Якщо ви не бачите рядок, спробуйте натиснути на елемент орієнтиру в меню «Дерево компонентів», який повинен бути вимкнений ліворуч (якщо ви вже додали орієнтир).
Сурагч

1
Я не бачу кола, але, натиснувши ліворуч від настанови, я можу змінити його на відсотки. Дякую.
Marcel50506

Це найкраща відповідь, оскільки він пропонує кращий підхід до компонування. Ми можемо вирівняти декілька поглядів на базові орієнтири, а не додавати відсоток лише до одного виду
Нгуен Мінь Хіен

33

Посібник неоціненний - а додаток: 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>

2
@Plumbus - Ваги еквівалентні відсоткам (будь-який відсоток можна математично перетворити на вагу і навпаки). Будучи терміновим у термінології, ви пропускаєте точку відповіді.
Скотт Біггс

11

З ConstraintLayout v1.1.2 розмір повинен бути встановлений, 0dpа потім встановити значення layout_constraintWidth_percentабо 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

Макет обмежень 1.0 при перегляді займає відсоток екрана, необхідний для створення двох рекомендацій. У макеті обмежень 1.1 це було спрощено, дозволяючи легко обмежувати будь-який вид на відсоткову ширину або висоту.

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

Хіба це не фантастично? Усі представлення підтримують атрибути layout_constraintWidth_percent та layout_constraintHeight_percent. Це призведе до фіксації обмеження у відсотках від наявного простору. Таким чином, розширення кнопки або TextView для заповнення відсотка екрана можна виконати за допомогою декількох рядків XML.

Наприклад, якщо ви хочете встановити ширину кнопки на 70% екрану, ви можете зробити це так:

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

Зауважте, що вам потрібно буде розмістити розмір, слід використовувати у відсотках до 0dp, як ми вказали android: layout_width до 0dp вище

Аналогічно, якщо ви хочете встановити висоту кнопки на 20% екрану, ви можете зробити це так:

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

Побачити! ми вказали на цей раз android: layout_height до 0dp, оскільки ми хочемо, щоб кнопка використовувала висоту у відсотках.


8

Спробуйте цей код. Ви можете змінити відсотки висоти та ширини за допомогою програми: 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"


5

Для когось, хто може виявитися корисним, ви можете використовувати layout_constraintDimensionRatioім будь-який дочірній вигляд усередині 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

Я знаю, що це не безпосередньо те, про що спочатку просила ОП, але це мені дуже допомогло в цій ситуації, коли у мене виникло подібне питання. Додавання цього для людей, які хочуть змінити розмір вікна макета (яким я користуюсь регулярно), за допомогою коду . Додайте це до свого 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%.

Також якщо ви зараз спробуєте перетягнути вказівки, перетягнуте значення тепер з’явиться у% віці.


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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.