Разрабатывайте в Jetpack Compose вместе со мной

Моя история с Constraint Layout в Compose
Еще в 2020 году, когда Jetpack Compose все еще находился на ранней стадии, я написал статью об ограниченном макете в Jetpack Compose. Вы можете прочитать об этом здесь, если вам интересно (не обязательное условие), но то, как компоновка ограничений созрела с тех пор, делает ее совершенно отличной от той, что была тогда, и улучшение на самом деле имеет смысл.
Введение
Эта статья не о сравнении, а о том, как использовать зрелую компоновку с ограничениями в сегодняшнем Jetpack Compose для разработки сложных компонуемых объектов. Я собираюсь сосредоточиться на четырех важнейших концепциях компоновки ограничений:
1. Basics — Simple Contraints 2. Guidlines 3. Barriers 4. Bias
Прежде чем идти дальше, я дам вам краткое объяснение четырех понятий. Компоновка ограничений не является новой концепцией в AndroidDev, она фактически унаследована от традиционной разработки Android до Jetpack Compose.
Основы — простые ограничения
Простые ограничения — это не что иное, как позиционирование представления с определенными ограничениями (отношениями) к его родительским представлениям или родственным представлениям.
Рекомендации
Направляющие — это не что иное, как невидимые линии, которые вы можете разместить в макете и ограничить представления.
Барьеры
Барьеры аналогичны рекомендациям, но с помощью барьеров вы можете ограничить представление несколькими представлениями через один источник. Если это немного сложно понять, не волнуйтесь, мы собираемся подробно изучить вещи в следующих разделах этой статьи.
Предвзятость
Смещение используется для управления пространством между представлением и тем, чем оно ограничено, в основном они используются с представлениями, выровненными по центру.
Предпосылки
Прежде чем идти дальше, вы должны иметь базовые знания о том, как работать с Jetpack Compose. Если вы новичок в Compose, я настоятельно рекомендую ознакомиться со следующими статьями:
С учетом сказанного, давайте начнем.
Функции, с которыми вы должны быть знакомы, чтобы освоить Constraint Layout в Compose
ConstraintLayout
ConstraintLayout — это не что иное, как компонуемая функция, которая может позиционировать своих дочерних элементов на основе указанных ограничений. Он также принимает модификатор в качестве необязательного параметра.
ConstraintLayout {
// Childs goes here
}
createRefs
createRefs — это функция, которая предоставляет нам простой способ создать ConstrainedLayoutReferences (ничего, кроме макетов внутри макета ограничения). Эта функция использует объявления деструктуризации в Kotlin для создания необходимого количества ссылок.
ConstraintLayout {
val (title, subtitle, image) = createRefs()
}
Здесь заголовок, подзаголовок и изображение — не что иное, как представления, на которые мы ссылаемся внутри макета ограничения.
ограничить как
constrainAs — не что иное, как функция расширения Модификатора. Он имеет два параметра:
- Первый параметр:
ConstrainedLayoutReference, он в основном используется для назначения идентификатора для просмотра, значение должно быть одной из ссылок, которые мы создаем с помощью функцииcreateRefs. - Второй параметр:
ConstrainScope, не что иное, как функция, в которой мы указываем все ограничения, которые мы хотим применить к текущему представлению/компоновке.
Modifier.constrainAs(subtitle) {
top.linkTo(title.bottom)
}
Основы — простые ограничения
Давайте начнем с основ, начиная с того, как связать представление с его родителем. Например, ограничение представления по центру по вертикали, горизонтали или по центру всего экрана.
Одна из новых функций, с которыми вы столкнетесь здесь, — это linkTo. Это не что иное, как способ определить ограничение, используя VerticalAnchorable(start и end) и HorizontalAnchorable(top и bottom).

Далее следует ограничить представление относительно его братьев и сестер. Чтобы изучить этот вариант использования, давайте возьмем классический пример заголовка, подзаголовка и изображения.
Box — это не что иное, как простая составная функция, здесь мы используем блок вместо изображения, чтобы все было просто и лаконично. centerVerticallyTo — это не что иное, как служебная функция для добавления ограничений top и bottom к представлению, отправленному через параметр, также мы можем centerHorizontallyTo добавить ограничения start и end.

Если вы видите вывод, он немного неуклюж, потому что между представлениями и его parent нет промежутка. Мы можем добавить поля при создании ограничений, используя необязательный параметр margin внутри функции linkTo. Взгляни:
start.linkTo(image.end, margin = 16.dp)

Рекомендации
Как уже говорилось, руководящие принципы — это не что иное, как невидимые линии, с помощью которых мы можем ограничивать фактический вид в макете. Традиционно GuideLine может быть как горизонтальным, так и вертикальным:
- Вертикальные направляющие с нулевой шириной и высотой равны своему родительскому элементу.
- Горизонтальные направляющие с нулевой высотой и шириной равны своему родительскому элементу.
Compose предлагает чрезвычайно простой способ создания направляющих с помощью таких функций, как createGuidelineFromStart, createGuidelineFromEnd, createGuidelineFromTop, createGuidelineFromBottom и других. Каждая функция принимает значение float в качестве необязательного параметра для выравнивания направляющей относительно нее в указанном направлении.

Барьеры
Как я уже сказал, барьер похож на руководство, но реальное преимущество заключается в масштабировании нескольких представлений во время выполнения. Проще говоря, используя барьер, представление может быть ограничено несколькими одноуровневыми представлениями.
Подобно рекомендациям, compose предлагает набор функций для создания барьеров, таких как: createStartBarrier, createEndBarrier, createTopBarrier, createBottomBarrier и других. Каждая из этих функций принимает два параметра:
elements: Ничего, кроме ConstrainedLayoutReference, который мы создаем с помощьюcreateRefs. Барьер будет ограничен этими ссылками. Представления, которые зависят от этого барьера, изменят положение на основе предоставленных эталонных измерений.margin: используется для определения поля между представлениями/составными объектами.

Байс
Поскольку указанное смещение используется для управления пространством между представлением и тем, чем оно ограничено, доля сохраняемого пространства определяется как float. Здесь мы используем следующие linkTo для позиционирования представления и добавления смещения:
fun linkTo(
start: ConstraintLayoutBaseScope.VerticalAnchor,
end: ConstraintLayoutBaseScope.VerticalAnchor,
startMargin: Dp = 0.dp,
endMargin: Dp = 0.dp,
@FloatRange(from = 0.0, to = 1.0) bias: Float = 0.5f
)
start: определить начальное ограничение представления.end: определяет конечное ограничение вида.- Принимая во внимание, что
startMarginиendMarginдолжны определять поля с выравниванием. - смещение — это доля разрыва, которую мы хотим добавить к представлению.

На данный момент - все. Надеюсь, вы узнали что-то полезное. Спасибо за прочтение.