Flex компонент setActualSize - PullRequest
       3

Flex компонент setActualSize

1 голос
/ 02 апреля 2012

Я немного запутался в методе setActualSize. Из того, что я прочитал, следует, что если он не вызван родительским компонентом, компонент не будет отображаться.

Похоже, что setActualSize является критическим методом, напрямую связанным с рендерингом UIComponent. Также представляется, что свойства width и height UIComponent переопределяют функциональность свойств width и height flash.display.DisplayObject, поскольку они не связаны напрямую с рендерингом объекта, а являются виртуальными значениями, которые в основном используются getExplicitOrMeasured, когда родительский компонент компонента вызывает метод setActualSize компонента.

Так что вопрос:

1) Почему поведение каждого компонента по умолчанию не просто вызывать setActualSize (getExplicitOrMeasuredWidth (), getExplicitOrMeasuredHeight ()) для самого себя?

2) Я предполагаю, что этот вопрос проистекает из вышеуказанного вопроса и поведения, как я понимаю, как описано выше: меняет ли setActualSize видимость компонента?

Похоже, что такое поведение заключается в том, что компонент не отображается до вызова setActualSize, но если он сам содержит дочерние объекты экранного объекта (ожидаемое поведение, поскольку он может вычислять меру самостоятельно) и добавляется в список отображения, то только Причина, по которой Flash не отображает его, заключается в том, что его не видно.

Ответы [ 2 ]

4 голосов
/ 02 апреля 2012

Ответы на ваши вопросы в том, как работает жизненный цикл компонента Flex, рассмотрим следующие две фазы:

измерение: Платформа Flex вызовет метод measure() вашего компонента. Вы можете переопределить этот метод, чтобы установить по умолчанию и / или минимальный размер для вашего компонента.

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

рендеринга: Позже Flex вызывает метод updateDisplayList() вашего компонента. Вы можете переопределить это для размера / расположения дочерних объектов вашего компонента. Вот где setActualSize() предназначен для использования: родительский элемент вызывает setActualSize() для своих дочерних объектов, а не для себя.

Обратите внимание на сигнатуру метода updateDisplayList ():

protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void

Измерение было сделано снизу вверх. Однако рендеринг выполняется сверху вниз. Таким образом, во время рендеринга updateDisplayList (unscaledWidth, unscaledHeight) выполняется для вашего компонента. Flex сообщает вашему компоненту пространство, которое было отведено для его визуализации, и ваш компонент должен соответственно определять размер / положение своих дочерних объектов и / или выполнять программное рисование.

Размеры, передаваемые в updateDisplayList (), зависят от различных факторов:

  • как / если вы переопределяете метод measure () (показатель не вызывается, когда ваш компонент имеет фиксированную ширину / высоту)
  • типы размеров параметры (фиксированные, проценты, ограничения) и используемые макеты

старый, но хороший ресурс на эту тему

1 голос
/ 24 апреля 2012

setActualSize () является одним из наиболее важных и интересных методов в процессе макета Flex:

1) Обратите внимание, что setActualSize () является точкой входа для макета родителя для установки размера компонента, и он должен вызываться родительским (контейнером) почти исключительно!

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

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

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

Используя этот метод, изменяется только размер рендеринга - не (явные) ширина и высота, а _width и _height - это означает, что если по какой-то причине размер контейнера снова изменится, дочерние элементы будут изменены по заданным правилам (процент от parent, расширение до размера дочернего компонента и т. д.)

2) Да, потому что, если этот метод вообще не вызывается, размер компонента (рендеринга) равен (0, 0), поэтому это является причиной его невидимости (не устанавливая 'visible' в false) ! ^ _ ^

Обратите внимание, что ДОЛЖЕН БЫТЬ ПЛАН (даже непривлекательный) для запуска этого вызова метода. Под «непривлекательным» я понимаю макет, который не должен делать ничего умного, например, ИЗМЕНИТЬ ШИРИНУ И ВЫСОТУ детей (например, абсолютный макет)!

Теперь рассмотрим метод addPopUp () класса PopUpManagerImpl: есть интересный случай вызова setActualSize ():

IUIComponent(window).setActualSize(
            IUIComponent(window).getExplicitOrMeasuredWidth(),
            IUIComponent(window).getExplicitOrMeasuredHeight());    

Объяснение: PopUpManager делает то, что обычно должен делать макет, потому что он ХОЧЕТ ЗНАТЬ ИЗМЕРЕНИЯ POPUP НЕМЕДЛЕННО, поэтому он может центрировать всплывающее окно на сцене. Нет времени ждать проход макета!

Если вы прокомментируете эти 3 строки в коде фреймворка, вы увидите, что всплывающее окно центрируется по левому верхнему углу - точно так же, как его размер (0, 0). В любом случае, он отображается с правильной шириной и высотой, потому что во время визуализации размеры известны.

Надеюсь, это прояснит ситуацию ...

Ура! ^ _ ^

Данко Козар

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...