Различия между ConstraintLayout и RelativeLayout

Меня смущает разница между ConstraintLayout и RelativeLayout. Может ли кто-нибудь сказать мне точные различия между ними?


person b2mob    schedule 19.05.2016    source источник
comment
ConstraintLayout в основном разработан для начинающих программистов, так что они могут легко создавать макет с помощью визуального редактора вместо создания макета вручную с помощью XML.   -  person CopsOnRoad    schedule 02.01.2017
comment
@Jack определенно имеет более глубокую цель для опытных разработчиков   -  person Moses Aprico    schedule 18.09.2017
comment
@MosesAprico, вы правы, он есть. Но я думаю, что у опытных разработчиков уже есть много других способов (они уже знают, например, RealtiveLayout, LinearLayout, GridLayout и т. Д.), Чтобы получить желаемую иерархию представлений.   -  person CopsOnRoad    schedule 20.09.2017
comment
@CopsOnRoad На самом деле ты ошибаешься. Apple занимается компоновкой с ограничениями уже более 5 лет. Вы получаете адаптивный дизайн любого размера и вам не нужно писать множество сложных макетов. Когда вы начинаете связывать несколько представлений, вам нужно всего 3 базовых элемента управления для создания полностью адаптивного дизайна.   -  person Nick Turner    schedule 25.10.2018


Ответы (10)


Цель ConstraintLayout - оптимизировать и сгладить иерархию представлений ваших макетов, применяя некоторые правила к каждому представлению, чтобы избежать вложенности.

Правила напоминают вам RelativeLayout, например, устанавливая левый левый угол какого-либо другого вида.

app:layout_constraintBottom_toBottomOf="@+id/view1"

В отличие от RelativeLayout, ConstraintLayout предлагает значение bias, которое используется для позиционирования вида с учетом горизонтального и вертикального смещения 0% и 100% относительно маркеров (отмеченных кружком). Эти проценты (и дроби) обеспечивают плавное позиционирование изображения на экранах разной плотности и размера.

app:layout_constraintHorizontal_bias="0.33" <!-- from 0.0 to 1.0 -->
app:layout_constraintVertical_bias="0.53" <!-- from 0.0 to 1.0 -->

Базовый маркер (длинная труба с закругленными углами, ниже круглого маркера) используется для выравнивания содержимого представления с другой ссылкой на представление.

Квадратные ручки (в каждом углу обзора) используются для изменения размера изображения в dps.

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

Это полностью основано на мнении, и мое впечатление о ConstraintLayout

person Nikola Despotoski    schedule 19.05.2016
comment
Мы все еще можем создавать плоский макет с помощью RelativeLayout, поэтому я не понимаю, где ConstraintLayout заботится, а RelativeLayout не может? - person ; 24.03.2017
comment
RelativeLayout - это двухпроходный макет, страдающий от двойного налогообложения. Он должен быть измерен / разложен как минимум дважды. ConstraintLayout не страдает от этого снижения производительности. - person Christopher Perry; 02.06.2017
comment
@ Ничего. Да, мы все еще можем создать плоский макет с помощью RelativeLayout. Но в дополнение ко всем упомянутым здесь ConstraintLayout позволяет использовать отрицательные поля. и размер подпредставлений в заранее заданном соотношении . Последний - самый надежный способ сохранить соотношение 16: 9 для вашего ImageView в CardView в соответствии с Материальный дизайн - person Eugene Brusov; 12.09.2017
comment
Некоторые макеты невозможны в RelativeLayout, если вы не вложите LinearLayout или другой RelativeLayout. Например: центрирование стопки из 3 представлений по вертикали относительно другого представления - person Gak2; 20.09.2017
comment
@ Gak2 Я не вижу в вашем примере ничего невозможного без вложенного макета. Может быть, вы имеете в виду что-то другое, чем я. Я просто использую layout_alignEnd, layout_below, layout _... и могу с его помощью построить любой стек ... - person The incredible Jan; 27.11.2017
comment
Кажется, вы можете использовать ConstraintLayout практически для всего без необходимости чего-либо еще? - person Yonatan Nir; 19.02.2019

Эквивалентные свойства Relative Layout и Constraint Layout

Эквивалентные свойства относительного макета и макета с ограничениями

(1) Относительный макет:

android:layout_centerInParent="true"    

(1) Эквивалент макета ограничений:

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"

(2) Относительный макет:

android:layout_centerHorizontal="true"

(2) Эквивалент макета ограничений:

app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintEnd_toEndOf="parent"

(3) Относительный макет:

android:layout_centerVertical="true"    

(3) Эквивалент макета ограничений:

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"

(4) Относительный макет:

android:layout_alignParentLeft="true"   

(4) Эквивалент макета ограничений:

app:layout_constraintLeft_toLeftOf="parent"

(5) Относительный макет:

android:layout_alignParentStart="true"

(5) Эквивалент макета ограничений:

app:layout_constraintStart_toStartOf="parent"

(6) Относительный макет:

android:layout_alignParentRight="true"

(6) Эквивалент макета ограничений:

app:layout_constraintRight_toRightOf="parent"

(7) Относительный макет:

android:layout_alignParentEnd="true"    

(7) Эквивалент макета ограничений:

app:layout_constraintEnd_toEndOf="parent"

(8) Относительный макет:

android:layout_alignParentTop="true"

(8) Эквивалент макета ограничений:

app:layout_constraintTop_toTopOf="parent"

(9) Относительный макет:

android:layout_alignParentBottom="true" 

(9) Эквивалент макета ограничений:

app:layout_constraintBottom_toBottomOf="parent"

(10) Относительный макет:

android:layout_alignStart="@id/view"

(10) Эквивалент макета ограничений:

app:layout_constraintStart_toStartOf="@id/view"

(11) Относительный макет:

android:layout_alignLeft="@id/view" 

(11) Эквивалент макета ограничений:

app:layout_constraintLeft_toLeftOf="@id/view"

(12) Относительный макет:

android:layout_alignEnd="@id/view"  

(12) Эквивалент макета ограничений:

app:layout_constraintEnd_toEndOf="@id/view"

(13) Относительный макет:

android:layout_alignRight="@id/view"

(13) Эквивалент макета ограничений:

app:layout_constraintRight_toRightOf="@id/view"

(14) Относительный макет:

android:layout_alignTop="@id/view"  

(14) Эквивалент макета ограничений:

app:layout_constraintTop_toTopOf="@id/view"

(15) Относительный макет:

android:layout_alignBaseline="@id/view" 

(15) Эквивалент макета ограничений:

app:layout_constraintBaseline_toBaselineOf="@id/view"

(16) Относительный макет:

android:layout_alignBottom="@id/view"

(16) Эквивалент макета ограничений:

app:layout_constraintBottom_toBottomOf="@id/view"

(17) Относительный макет:

android:layout_toStartOf="@id/view"

(17) Эквивалент макета ограничений:

app:layout_constraintEnd_toStartOf="@id/view"

(18) Относительный макет:

android:layout_toLeftOf="@id/view"  

(18) Эквивалент макета ограничений:

app:layout_constraintRight_toLeftOf="@id/view"

(19) Относительный макет:

android:layout_toEndOf="@id/view"

(19) Эквивалент макета ограничений:

app:layout_constraintStart_toEndOf="@id/view"

(20) Относительный макет:

android:layout_toRightOf="@id/view"

(20) Эквивалент макета ограничений:

app:layout_constraintLeft_toRightOf="@id/view"

(21) Относительный макет:

android:layout_above="@id/view" 

(21) Эквивалент макета ограничения:

app:layout_constraintBottom_toTopOf="@id/view"

(22) Относительный макет:

android:layout_below="@id/view" 

(22) Эквивалент макета ограничений:

app:layout_constraintTop_toBottomOf="@id/view"

person Naimatullah    schedule 10.07.2018
comment
Можете ли вы публиковать текст вместо изображения? Так что это будет очень полезно мне и другим в будущем. - person New Developer; 12.10.2018
comment
Каждый, кто начинает изучать макеты ограничений, должен это видеть. Спасибо. - person grantespo; 20.01.2019
comment
Это полезная информация, но она представляет собой просто дамп документации и ничего не дает, чтобы объяснить разницу между ними. - person YetAnotherRandomUser; 01.05.2019
comment
Нет, у меня нет времени заглядывать в документацию, это, безусловно, полезно. И написано простым языком. Голосование за. - person CodeToLife; 20.05.2019

Об этом сообщает @davidpbr ConstraintLayout performance

Я сделал два похожих макета с 7 дочерними элементами, каждый с родительским ConstraintLayout и RelativeLayout. На основе инструмента отслеживания методов Android Studio кажется, что ConstraintLayout проводит больше времени в onMeasure и выполняет дополнительную работу в onFinishInflate.

Используемая библиотека (support-v4, appcompat-v7…):

com.android.support.constraint:constraint-layout:1.0.0-alpha1

Устройства / версии Android воспроизводятся на: Samsung Galaxy S6 (SM-G920A. К сожалению, нет Nexus atm). Android 5.0.2

Сравнение трассировки быстрого метода:

1

Образец репозитория Github: https://github.com/OnlyInAmerica/ConstraintLayoutPerf

person Dhaval Jivani    schedule 30.07.2016
comment
из того же выпуска: я собираюсь закрыть это сейчас - альфа 4/5 принесла небольшое улучшение производительности. Вероятно, мы сможем улучшить его еще больше, но это может подождать после публикации 1.0. - person Oleksandr; 23.11.2016
comment
Не могли бы вы объяснить, какой инструмент вы использовали для создания этого отличного сравнения? - person Nativ; 02.03.2017
comment
@Nativ Monotirs- ›CPU-› Значок счетчика времени - person Andrey T; 04.03.2017
comment
Запустите и профилируйте тот же код с помощью constraint-layout: 1.0.1 на Nexus 5 с android 6.0.1, вот результаты: относительный макет - инициализация 2 мс при измерении 30 мс + 16 мс = 62 мс на Layouyt 7 мс = 9 мс всего 54 мс Схема ограничения - инициализация Макет ограничения 7 мс генерирует параметры макета + добавляет вид ~ 7 * 2 мс = 14 мс по мере 60 мс + 52 мс ~ 112 мс по макету 8 мс всего ~ 141 мс Первая инициализация относительного макета почти в три раза быстрее, чем ограничение. - person Andrey T; 04.03.2017
comment
Нам нужно сделать этот тест еще раз. Когда Constraint не в Alpha. - person Jakub S.; 21.10.2017
comment
@JacktheRipper: Google говорит, что ограничение работает быстрее. См. stackoverflow.com/a/47289870/1587329 - person serv-inc; 14.11.2017
comment
Просмотр ›Инструмент Windows› Android Profiler в Android 3.0 и более поздних версиях - person yehyatt; 29.07.2018
comment
Компоновка ограничений вводится так, чтобы иерархия вложенных представлений могла быть уменьшена. Таким образом, меньшая иерархия означает меньше времени на перемещение сверху вниз по дереву представления. Итак, какой смысл создавать иерархию вложенных представлений, которая может не понадобиться в макете ограничений, и сравнивая ее с относительной компоновкой, в которой у вас больше шансов получить вложенную структуру? - person codepeaker; 13.09.2018
comment
Это ценная информация, но не отвечает на вопрос. И даже не решает этот вопрос. - person YetAnotherRandomUser; 01.05.2019

Ниже приведены отличия / преимущества:

  1. Компоновка с ограничениями имеет двойную мощь как относительного макета, так и линейного макета: устанавливает относительное положение представлений (например, относительный макет), а также устанавливает веса для динамического пользовательского интерфейса (что было возможно только в линейном макете).

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

  3. В дополнение к весам мы можем применить горизонтальное и вертикальное смещение, которое представляет собой не что иное, как процент смещения от центра. (смещение 0,5 означает выравнивание по центру. Любое значение меньше или больше означает соответствующее движение в соответствующем направлении).

  4. Другой очень важной особенностью является то, что он уважает и предоставляет функциональные возможности для обработки представлений GONE, чтобы макеты не ломались, если для некоторого представления установлено значение GONE через код Java. Дополнительную информацию можно найти здесь: https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior

  5. Предоставляет возможности автоматического применения ограничений с помощью инструмента Blue print и Visual Editor, который упрощает создание страницы.

Все эти функции приводят к сглаживанию иерархии представлений, что повышает производительность, а также помогает в создании адаптивного и динамического пользовательского интерфейса, который может легче адаптироваться к разным размерам и плотности экрана.

Вот лучшее место для быстрого обучения: https://codelabs.developers.google.com/codelabs/constraint-layout/#0.

person Vishu Gupta    schedule 20.09.2017
comment
6) ConstraintLayout позволяет изменять размер подвидов в заранее определенных соотношениях medium. ru / google-developers /. Это было бы полезно, например, когда вы собираетесь сохранить изображение в формате 16: 9. - person Eugene Brusov; 21.09.2017

Большая разница в том, что ConstraintLayout соблюдает ограничения, даже если представление отсутствует. Таким образом, это не нарушит макет, если у вас есть цепочка, и вы хотите, чтобы представление исчезло посередине.

person Herrbert74    schedule 24.12.2016
comment
вы можете привести мне какой-нибудь пример? Допустим, есть 3 кнопки. Я скрою вторую кнопку, а третья кнопка будет прикреплена ко второй кнопке с идентификатором btn2. Предположим, я скрываю вторую кнопку, тогда как третья кнопка может найти идентификатор второй кнопки? - person ; 23.03.2017
comment
Это не правда. Если вы установите видимость кнопки как НЕВИДИМАЯ вместо УДАЛЕННОЙ, вы не нарушите ограничения. Что касается меня, самое большое отличие, как сказал @Nikola, - это предвзятость, которая помогает вам создавать больше отзывчивых просмотров. - person zapotec; 04.04.2017
comment
@Nothing Предположим, что кнопки находятся друг под другом. Даже если вы скроете tButton 2, он все равно будет присутствовать в контракте представления, либо в вашем xml, либо в коде. ConstraintLayout будет учитывать это, а кнопка 3 будет находиться под кнопкой 1. В RelativeLayout кнопка 2 исчезла, ограничение исчезло вместе с ней, поэтому кнопка 3 будет находиться в положении по умолчанию, то есть в верхнем левом углу экрана. - person Herrbert74; 12.05.2017
comment
@zapotec Я уважаю то, что другие вещи для вас важнее, но для меня это действительно крутая разница. Исправляет единственное, что я ненавидел в RelativeLayout. Использование невидимого - не вариант, потому что он займет место. - person Herrbert74; 12.05.2017

Официально ConstraintLayout намного быстрее

В версии Android N класс ConstraintLayout предоставляет функции, аналогичные RelativeLayout, но по значительно более низкой цене.

person serv-inc    schedule 14.11.2017

В дополнение к ответу @ dhaval-jivani.

Я обновил проект github до последней версии макета ограничений v.1.1.0-beta3.

Я измерил и сравнил время метода onCreate и время между началом onCreate и концом выполнения последнего метода preformDraw, который отображается на мониторе ЦП. Все тесты проводились на Samsung S5 mini с android 6.0.1 Вот результаты:

Новый запуск (открытие первого экрана после запуска приложения)

Относительный макет

OnCreate: 123 мс

Время рисования последней преформы - Время создания: 311,3 мс

Макет ограничения

OnCreate: 120,3 мс

Время рисования последней преформы - Время создания: 310 мс

Кроме того, я проверил тест производительности из этой статьи, здесь код и обнаружил, что on loop counts менее 100 Вариант компоновки ограничений выполняется быстрее при выполнении раздувания, измерения и компоновки, чем варианты с относительной компоновкой. А на старых устройствах Android, таких как Samsung S3 с Android 4.3, разница больше.

В заключение я согласен с комментариями из статьи:

Стоит ли рефакторинг старых представлений включать его с RelativeLayout или LinearLayout?

Как всегда: как всегда

Я бы не стал проводить рефакторинг, если у вас либо проблемы с производительностью с вашей текущей иерархией макета, либо вы все равно хотите внести значительные изменения в макет. Хотя в последнее время я не измерял его, я не обнаружил никаких проблем с производительностью в последних выпусках. Так что я думаю, вы должны безопасно использовать его. но - как я уже сказал - не мигрируйте просто ради миграции. Делайте это только в том случае, если в этом есть необходимость и выгода. Однако для новых макетов я почти всегда использую ConstraintLayout. Это намного лучше по сравнению с тем, что было у нас раньше.

person Andrey T    schedule 15.11.2017

Вывод, который я могу сделать,

1) Мы можем разрабатывать пользовательский интерфейс, не затрагивая xml-часть кода. Честно говоря, я чувствую, что Google скопировал дизайн пользовательского интерфейса в приложениях для iOS, это будет иметь смысл, если вы знакомы с разработкой пользовательского интерфейса в iOS, но в относительной компоновке сложно установить ограничения, не касаясь дизайна xml.

2) Во-вторых, он имеет плоскую иерархию представления, в отличие от других макетов, поэтому имеет лучшую производительность, чем относительный макет, что вы, возможно, видели из других ответов.

3) У него также есть дополнительные вещи, помимо того, что имеет относительный макет, например круговое относительное позиционирование, где мы можем расположить другой вид относительно этого на определенном радиусе с определенным углом, что не может быть сделано в относительном макете.

Я повторяю это еще раз, проектирование пользовательского интерфейса с использованием макета ограничений аналогично разработке пользовательского интерфейса в iOS, поэтому в будущем, если вы будете работать на iOS, вам будет проще, если вы использовали макет ограничения.

person murali krish    schedule 30.05.2018

Настоящий вопрос, который следует задать, заключается в том, есть ли причина использовать какой-либо макет, кроме макета ограничений? Я считаю, что ответ может быть отрицательным.

Тем, кто настаивает на том, что они нацелены на начинающих программистов или им подобных, следует указать причину, по которой они уступают любому другому макету.

Макеты ограничений лучше во всех отношениях (они стоят около 150 КБ в размере APK). Они быстрее, они проще, они более гибкие, они лучше реагируют на изменения, они устраняют проблемы, когда элементы уходят, они лучше соответствуют радикально разным типам экранов и не используют кучу вложенных циклов с такой длинной нарисованная древовидная структура для всего. Вы можете положить что угодно где угодно, относительно чего угодно и где угодно.

Они были немного странными в середине 2016 года, когда редактор визуального макета был недостаточно хорош, но они настолько хороши, что если у вас вообще есть макет, вы можете серьезно подумать об использовании макета с ограничениями, даже когда он делает то же самое, что и RelativeLayout, или даже простой LinearLayout. FrameLayouts явно по-прежнему имеют свою цель. Но на данный момент я не вижу ничего нового. Если бы они начали с этого, они бы больше ничего не добавили.

person Tatarize    schedule 29.05.2017
comment
Есть ли доказательства, что это быстрее? - person Rajesh Nasit; 06.11.2017
comment
да. Это быстрее. Макет опускается в одном решателе, а не в итерациях по дереву. Для большинства вещей это не имеет значения, потому что это делается при вызове макета. Но дерево представлений, хотя и простое, создает множество представлений внутри представлений, для которых требуются вызовы, требующие вызовов. Хотя теоретически это лучше, на практике выполнение макета в одном бите кода намного проще, чем повторение всего дерева представления. Было бы более впечатляюще с большим количеством просмотров, но вот майский тест: medium.com/@krpiotrek / constraintlayout-performance-c1455c7984d7 - person Tatarize; 06.11.2017
comment
Я столкнулся с другим вопросом: следует ли заменить все существующие Relativelayouts в приложении, над которым я работаю? Существенно ли улучшит производительность? - person Sreekanth Karumanaghat; 25.03.2019
comment
@SreekanthKarumanaghat, похоже, вы никогда не вернете время, необходимое для их замены, когда переключение времени спасет вас. Мы говорим о цикле 3,5 мс, который в большинстве случаев снижается до 3,25 мс. Если это дает вам дополнительную функцию или что-то, что вам нужно, тогда конечно, но чисто из соображений скорости нет. Хотя мы говорим о нажатии кнопки конвертировать. - person Tatarize; 26.03.2019

Единственное отличие, которое я заметил, заключается в том, что элементы, установленные в относительной компоновке с помощью перетаскивания, автоматически получают свои размеры относительно других элементов, поэтому, когда вы запускаете приложение, вы получаете то, что вы видите. Однако в макете ограничения, даже если вы перетаскиваете элемент в представлении дизайна, при запуске приложения все может измениться. Это можно легко исправить, установив ограничения вручную или, что более рискованно, щелкнув правой кнопкой мыши элемент в дереве компонентов, выбрав подменю компоновки ограничений, а затем щелкнув «вывести ограничения». Надеюсь это поможет

person Wilson    schedule 02.06.2017