Flex - Пользовательский компонент - Процентная ширина / высота - PullRequest
4 голосов
/ 18 марта 2010

Я пытаюсь создать пользовательский компонент Flex с помощью инфраструктуры компонентов Flex:

http://www.adobe.com/livedocs/flex/3/html/help.html?content=ascomponents_advanced_3.html.

Все хорошие компоненты позволяют вам определять их размеры, используя процентные значения, используя:

MXML:

TextInput width = "100%"

или

Actionscript во время выполнения:

textinp.percentWidth = 100;

Мой вопрос заключается в том, как реализовать процентную ширину / высоту в методе measure () вашего пользовательского компонента? В частности, эти проценты на каком-то этапе преобразуются в значения пикселей, как это делается?

1 Ответ

6 голосов
/ 22 июня 2010

Способ работы Flex-макетов заключается в том, чтобы каждый компонент располагал свои дочерние элементы до размера, указанного родительским элементом. «Дочерние элементы» включают в себя обычные дочерние элементы - getChildren (), numChildren - а также те компоненты, которые составляют границы, маркеры и т. Д., Которые называются «chrome» и являются частью getRawChildren ().

Платформа Flex теперь выполняет два цикла для всех компонентов (которые фактически являются частью дерева отображения). Первый - снизу вверх (сначала самые глубокие вложенные элементы) и вызывает метод measure (). Он должен рассчитать, сколько места (ширины / высоты) займет компонент, если он может иметь столько места, сколько он хочет, без ограничений (например: полосы прокрутки) и поместить его в свойства MeasureWidth и measureHeight. Во-вторых, он вычисляет, сколько места он хочет иметь в качестве абсолютного минимума, помещенного в measureMinHeight / measureMinWidth. Чтобы вычислить это, толщину границы, хром и обычные дочерние элементы спрашивают об их размерах, используя getExplicitOrMeasuredHeight () / Width (), и складывают вместе. Вот почему это первая глубина.

Второй цикл состоит в том, чтобы сделать фактическое расположение. Это начинается в верхней части дерева, и вызывается updateDisplayList с параметрами x / y, указывающими компоненту, какого размера он действительно имеет. На основе этой информации компонент сообщит своим непосредственным дочерним элементам, где они должны быть (относительно своих родителей) и насколько они должны быть большими - child.move (x, y) и child.setActualSize (w, h)

Так что на самом деле родительский контейнер учитывает относительные размеры. Ваш компонент заявляет, что он идеален (минимальный размер, чтобы все могло отображаться) и минимальный размер в measure () и должен иметь дело с тем, что он получает в свой updateDisplayList (). Родительский компонент занимает доступное пространство, которое он имеет, гарантирует, что каждый компонент получает свой минимальный размер, а затем распределяет остальное для всех компонентов. На этом этапе он будет смотреть на проценты width / height своих дочерних элементов.

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

...