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


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

11 150

11 ответов:

намерение 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.

enter image description here

это полностью мнение на основе и мой впечатление от ConstraintLayout

сообщает @davidpbrConstraintLayout производительность

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

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

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

устройства / Android версии воспроизводятся на: Samsung Галактика С6 (см-G920AКУПЛЕННЫЙ. К сожалению, не Нексус банкомат.) Android 5.0.2

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

1

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

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

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

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

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

4) Еще одна очень важная особенность заключается в том, что он уважает и обеспечивает функциональность для обработки исчезнувших представлений, чтобы макеты не ломались, если какой-то вид установите значение прошло через java-код. Более подробную информацию можно найти здесь: https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior

5) обеспечивает силу автоматического ограничения прикладывая при помощи инструмента голубой печати и визуального редактора который делает его легким конструировать страницу.

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

вот лучшее место, чтобы быстро учиться: https://codelabs.developers.google.com/codelabs/constraint-layout/#0

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

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

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

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

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

RelativeLayout и ConstraintLayout эквивалентных свойств:

Relative Layout and Constraint layout equivalent properties]

процесс рисования Android View состоит из 3 этапов. Вы можете найти соответствующие методы, когда выходит ViewGroup

  • мера
  • планировка
  • ничья

используя Systrace tool мы можем рассчитать меру / макет

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

enter image description here

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

enter image description here

разница в производительности (с помощью OnFrameMetricsAvailableListener это позволяет собирать информацию о времени кадр за кадром о визуализации пользовательского интерфейса вашего приложения)

ConstraintLayout выполняет около 40% лучше в фазе измерения / компоновки, чем RelativeLayout

enter image description here

и последнее, но не менее ConstraintLayout это современный способ построения ответственного пользовательского интерфейса, он постоянно разработка, и каждый релиз приносит интересные функции, которые делают жизнь более легкой. Последнее - это Ограничение Разметки 1.1

подробнее:

https://constraintlayout.com/

https://android-developers.googleblog.com/2017/08/understanding-performance-benefits-of.html

https://medium.com/google-developers/building-interfaces-with-constraintlayout-3958fa38a9f7

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

я обновил проект github проект до последней версии ограничения макета V. 1. 1. 0-beta3

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

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

Относительная Разметка

OnCreate: 123ms

последний раз preformDraw времени метод onCreate: 311.3 МС

Макет Ограничение

OnCreate: 120.3 ms

Last preformDraw time-OnCreate time: 310ms

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

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

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

Как всегда: это зависит

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

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

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

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

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

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

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

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

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