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

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

Ответ 1

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

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

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

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

Ответ 2

Здесь может быть полезно получить краткую справку.
Используйте: руководство с app:layout_constraintGuide_percent, например:

<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"/>

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

Примечание. Используйте androidx.constraintlayout.widget.Guideline при использовании артефактов AndroidX.

Ответ 3

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

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

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

Ответ 4

С новым выпуском 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% ширины родительского вида.

Ответ 5

Как использовать рекомендации

Принятый ответ немного неясен о том, как использовать рекомендации и что такое "заголовок".

Шаги

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

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

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

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

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

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

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

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

Ответ 6

Принцип неоценим - и приложение: 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>

Ответ 7

С 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 и последующими версиями)

Ответ 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'
}

enter image description here

Ответ 9

вы можете использовать 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"

Ответ 10

Для кого-то, кто может оказаться полезным, вы можете использовать layout_constraintDimensionRatio im любого дочернего представления внутри 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" вы можете найти больше информации ЗДЕСЬ

Ответ 11

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

app:layout_constraintGuide_begin="291dp"

с

app:layout_constraintGuide_percent="0.7"

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

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

Ответ 12

Я знаю, что это не то, о чем изначально первоначально просил 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));