Компонент LayoutGroup и LayoutChild

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

Основные свойства

  1. type Определяет тип компоновки. Он может быть одного из следующих:

    • Horizontal — элементы размещаются горизонтально (в одну строку).
    • Vertical — элементы размещаются вертикально (в один столбец).
    • Grid — элементы размещаются в виде сетки.
  2. padding Свойство, которое определяет внутренние отступы между элементами внутри контейнера. Может быть задано в виде объекта, где каждый параметр отвечает за соответствующую сторону: top, right, bottom, left.

  3. spacing Задает расстояние между элементами. Это значение может быть положительным (для увеличения промежутков) или отрицательным (для сжатия элементов).

  4. fitWidth Если активировано, то контейнер автоматически изменяет свою ширину в зависимости от содержимого.

  5. fitHeight Аналогично fitWidth, но применяется к высоте контейнера.

  6. alignment Определяет выравнивание дочерних элементов внутри контейнера. Можно задать выравнивание по центру, слева, справа или по другим направлениям, в зависимости от типа компоновки.

  7. wrap Включает или отключает автоматическое переноса элементов в случае нехватки места.

Пример использования LayoutGroup

var layoutGroup = new pc.Entity();
layoutGroup.addComponent('layoutgroup', {
    type: 'Vertical',
    padding: { top: 10, right: 10, bottom: 10, left: 10 },
    spacing: 15
});

var child1 = new pc.Entity();
var child2 = new pc.Entity();

layoutGroup.addChild(child1);
layoutGroup.addChild(child2);

app.root.addChild(layoutGroup);

В этом примере создаётся вертикальный контейнер с отступами и расстоянием между дочерними элементами. Каждый дочерний элемент будет размещён в контейнере с учётом настроек отступов и расстояний.

Компонент LayoutChild

Компонент LayoutChild используется для определения, как отдельный элемент будет вести себя внутри контейнера, использующего LayoutGroup. Этот компонент помогает гибко настраивать поведение дочерних объектов в зависимости от их положения в контейнере и особенностей компоновки.

Основные свойства

  1. flexOrder Указывает порядок, в котором элементы будут размещаться в контейнере, если это необходимо. Обычно используется в сочетании с другими параметрами, чтобы установить приоритет размещения.

  2. flexGrow Определяет, как дочерний элемент будет расти, чтобы заполнить доступное пространство. Если установлено значение больше 0, элемент будет увеличиваться в размере, чтобы заполнить контейнер, пропорционально оставшемуся пространству.

  3. flexShrink Задаёт коэффициент сжатия элемента при уменьшении размера контейнера. Чем выше значение, тем быстрее элемент будет сжиматься.

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

  5. alignment Задаёт выравнивание дочернего элемента внутри контейнера относительно других элементов. Это выравнивание может быть разным в зависимости от компоновки контейнера.

  6. stretch Если установлено значение true, элемент будет растягиваться по всей доступной оси (горизонтальной или вертикальной) в зависимости от типа компоновки контейнера.

Пример использования LayoutChild

var layoutChild = new pc.Entity();
layoutChild.addComponent('layoutchild', {
    flexGrow: 1,
    flexBasis: 100
});

layoutGroup.addChild(layoutChild);

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

Взаимодействие LayoutGroup и LayoutChild

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

  1. Динамическое изменение размеров При изменении размеров контейнера дочерние элементы с компонентом LayoutChild будут автоматически адаптироваться к новым условиям, используя свойства flexGrow, flexShrink и flexBasis.

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

  3. Сеточные компоновки Для сложных интерфейсов, где элементы должны быть размещены в сетке, компонент LayoutGroup с типом Grid помогает организовать элементы в виде таблицы, а LayoutChild даёт возможность настроить поведение каждого элемента в этой таблице, включая его растяжение, выравнивание и порядковый номер.

Особенности и рекомендации

  • Производительность Хотя компоненты LayoutGroup и LayoutChild полезны для быстрого прототипирования и разработки интерфейсов, они могут оказывать влияние на производительность при большом количестве элементов. Чтобы уменьшить нагрузку на систему, важно избегать слишком сложных вложенных структур с большим числом компонентов.

  • Использование с динамическим контентом Если интерфейс включает в себя динамически добавляемые или изменяющиеся элементы, важно обновлять компоненты LayoutGroup и LayoutChild по мере необходимости. Например, при добавлении нового элемента в контейнер может потребоваться перерисовать его или перерасчитать размеры.

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

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