Расположение и размеры элементов
Размеры
Типы определения размера
Регулировать размеры элементов в карточке можно с помощью параметров width и height элемента container. Они принимают одно из значений size:
- match_parent — значение по умолчанию для ширины, элемент подстраивается под содержащий его блок;
- wrap_content — значение по умолчанию для высоты, элемент подстраивается под свое содержимое;
- fixed — фиксированное значение размера.
Чтобы элемент занимал половину высоты или располагался внизу контейнера, используйте match_parent. Алгоритм распределяет место в таком порядке:
- Место занимают элементы со значениями размера
fixedиwrap_content. - Оставшееся место делят элементы со значением размера
match_parent. По умолчанию все элементы со значением размераmatch_parentподелят место поровну или распределят его согласно значению параметраweight, если он указан.
Ограничения размера
Типы размеров match_parent и wrap_content поддерживают дополнительные ограничения размера с помощью свойств min_size и max_size:
min_size— устанавливает минимальный размер элемента. Элемент никогда не будет меньше этого значения.max_size— устанавливает максимальный размер элемента. Элемент никогда не будет больше этого значения.
Эти ограничения полезны для обеспечения разумных размеров элементов при сохранении их адаптивности к содержимому или родительскому контейнеру.
Пример: match_parent с ограничениями размера
{
"type": "container",
"orientation": "vertical",
"items": [
{
"type": "text",
"text": "Этот текст имеет ограниченную ширину match_parent",
"width": {
"type": "match_parent",
"min_size": {
"value": 100,
"unit": "dp"
},
"max_size": {
"value": 300,
"unit": "dp"
}
}
}
]
}
Пример: wrap_content с ограничениями размера
{
"type": "text",
"text": "Этот текст имеет ограниченную высоту wrap_content",
"height": {
"type": "wrap_content",
"min_size": {
"value": 50,
"unit": "dp"
},
"max_size": {
"value": 200,
"unit": "dp"
}
}
}

Посмотреть интерактивный пример
Единицы измерения размера
Примечание
Единица измерения sp используется только на Android.
Если используется тип fixed, то результат зависит от единиц измерения:
dp(density-independent pixels) — стандартная единица измерения размеров, которая используется по умолчанию и не зависит от плотности экрана;sp(scale-independent pixels) — единица измерения, которая зависит от коэффициента размера текста в телефоне.
Если в элементе есть текст, указывайте высоту в sp, чтобы блок масштабировался вместе с текстом. Если текст не помещается, используйте dp.
Границы элемента
Для определения рамок у элементов используются параметры paddings и margins элемента container:
paddings— расстояние от контента карточки до ее границ;margins— расстояние от границ карточки до других элементов и границ контейнера. Не влияет на размер самой карточки.

Выравнивание
Для выравнивания внутри элементов по горизонтали и вертикали используются следующие параметры элемента container:
alignment_horizontal— выравнивание по горизонтали. Может принимать значенияleft,center,right. Внутри горизонтально выравненного контейнера можно выравнивать только по вертикали, т. е. применятьcontent_alignment_verticalсо значениямиleft(по умолчанию),center,right.alignment_vertical— выравнивание по вертикали. Может принимать значенияtop,center,bottom. Внутри вертикально выравненного контейнера можно выравнивать по горизонтали, т. е. применятьcontent_alignment_horizontalсо значениямиtop(по умолчанию),center,bottom.
Если внутри контейнера указать выравнивание, например content_alignment_horizontal, то дочерние элементы наследуют этот параметр. Если значения указаны в дочерних, то они будут переопределены.

Посмотреть интерактивный пример
Получение размеров элементов с помощью Layout Provider
Layout provider позволяет получить фактический размер отрисованного элемента и сохранить его в переменные. Это особенно полезно для создания адаптивных макетов, где размеры одного элемента должны зависеть от фактического размера другого элемента.
Важно
Использование layout provider приводит к дополнительным проходам компоновки (layout passes), что может существенно снизить производительность рендеринга. Используйте эту функцию только когда это действительно необходимо, и избегайте создания длинных цепочек зависимостей между элементами.
Как это работает
Когда вы указываете значения размера, такие как wrap_content или match_parent, финальный размер вычисляется во время выполнения. Layout provider предоставляет доступ к этим вычисленным размерам, автоматически обновляя указанные переменные шириной и высотой элемента после компоновки.
Процесс работает следующим образом:
- Объявите переменные для хранения размеров элемента
- Добавьте
layout_providerк элементу с именами переменных - После того как элемент будет размещен, переменные автоматически обновятся его фактическими размерами
- Используйте эти переменные в выражениях для размеров других элементов
Параметры
Свойство layout_provider принимает объект с двумя необязательными параметрами:
width_variable_name: Имя переменной, в которую будет сохранена ширина элемента (в dp)height_variable_name: Имя переменной, в которую будет сохранена высота элемента (в dp)
Вы можете указать один или оба параметра в зависимости от ваших потребностей.
Расчет размера
Размер, сохраняемый в переменных, представляет собой область содержимого элемента:
- Включает: Ширину и высоту элемента в отрисованном виде, включая paddings и borders
- Исключает: Margins не включаются в вычисленный размер
Пример адаптивного макета
Распространенный случай использования — создание элементов, размер которых зависит от других элементов. В этом примере мы создаем три блока, где размеры каждого последующего блока зависят от предыдущих:
Посмотреть интерактивный пример
Рекомендации
- Инициализируйте переменные: Всегда объявляйте переменные с начальными значениями (обычно 0) перед использованием их с layout_provider
- Избегайте циклических зависимостей: Не создавайте ситуации, когда размер элемента A зависит от элемента B, а размер элемента B зависит от элемента A
- Используйте подходящие типы: Объявляйте переменные с типом
integerдля значений размеров
Узнать больше
Следите за новостями DivKit в Telegram-канале: http://t.me/divkit_news.
Также вы можете обсуждать интересующие вас темы в сообществе пользователей DivKit в Telegram: https://t.me/divkit_community_ru.