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

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

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

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

 app:layout_constraintBottom_toBottomOf="@+id/view1" 

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

 app:layout_constraintHorizontal_bias="0.33"  app:layout_constraintVertical_bias="0.53"  

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

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

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

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

Сообщено командой @davidpbr ConstraintLayout

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

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

‘Com.android.support.constraint: ограничение-макет: 1.0.0-альфа1’

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

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

1

Пример рефинансирования Github: https://github.com/OnlyInAmerica/ConstraintLayoutPerf

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

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

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

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

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

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

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

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

В дополнение к ответу @ дхавал-дживани.

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

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

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

Относительная компоновка

OnCreate: 123ms

Last preformDraw time – OnCreate time: 311.3ms

Конфигурация ограничений

OnCreate: 120.3ms

Last preformDraw time – OnCreate time: 310ms

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

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

Стоит ли реорганизовать старый режим просмотра на RelativeLayout или LinearLayout?

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

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

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

  • Мера
  • раскладка
  • Привлечь

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

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

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

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

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

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

И последнее, но не менее важное: ConstraintLayout – это современный способ создания ответственного интерфейса, он постоянно развивается, и каждый выпуск приносит интересные функции, которые облегчают жизнь. Последним является Constraint Layout 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

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

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

[ Свойства эквивалентной компоновки и ограничений ограничений [Свойства эквивалентной компоновки и ограничения ограничений]

Заключение, которое я могу сделать, это

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

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

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

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

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

  • Вызывается: java.lang.UnsupportedOperationException: невозможно преобразовать в измерение: type = 0x1
  • Какова цель использования менеджеров макетов Java?
  • Процентная ширина в RelativeLayout
  • Как реализовать Drag and Drop в Android 2.2?
  • Использование API Google Адресов
  • Как установить атрибут layout_weight динамически из кода?
  • Эффект пульсации на Android Lollipop CardView
  • MonoDroid: ошибка при вызове конструктора пользовательского представления - TwoDScrollView
  • Почему эта строка xmlns: android = "http://schemas.android.com/apk/res/android" должна быть первой в XML-файле макета?
  • Как использовать составную возможность рисования вместо LinearLayout, которая содержит ImageView и TextView
  • Scrollview может содержать только одного прямого дочернего
  • Interesting Posts

    В чем смысл гибкости streamов в ASP.Net?

    Включение внешних jar-файлов в новую сборку jar-файлов с Ant

    Преобразование Excel в формат строки

    Как заменить все строки на числа, содержащиеся в каждой строке в Notepad ++?

    Чтение настроек из app.config или web.config в .net

    Почему «десятичный» не является допустимым типом параметра атрибута?

    EF, включая другие объекты (шаблон общего репозитория)

    Как убить фоновые процессы / задания при выходе из сценария оболочки?

    Является ли наиболее значительная десятичная цифра точностью, которая может быть преобразована в двоичную и обратно в десятичную без потери значимости 6 или 7.225?

    почему List .toArray () возвращает Object , а не String ? как обойти это?

    Android N изменяет язык программным путем

    Являются ли SSD полезными для разработки программного обеспечения?

    Могу ли я вернуться в функцию void?

    Захват изображения с камеры и отображение в действии

    Какова стандартная служба ftp сервера ubuntu 12.04?

    Давайте будем гением компьютера.