Встроить DisplayObjectContainer в гибкий компонент … как?

#flash #apache-flex

#flash #apache-flex

Вопрос:

Я перепишу этот вопрос, чтобы было понятнее.

Я пытаюсь получить файл класса из Flash в Builder.

Все в этом классе находится внутри спрайта с именем mainContainer . Теперь я пытаюсь перенести этот `MainContainer’, который содержит графику для класса, в гибкое приложение.

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

Сначала я объявляю MXML Canvas с изображением внутри него (как я читал, это сработало бы):

 <mx:Canvas x="268" y="10" width="756" height="680" id="canvas">
    <mx:Image id="spriteLayer" x="268" y="0" width="756" height="700" scaleContent="false" autoLoad="true">

    </mx:Image>
</mx:Canvas>}
  

Хорошо, тогда мой план состоял в том, чтобы передать ссылку на изображение her of spriteLayer классу, который я пытаюсь запустить:

 импорт включает в себя.Спирограф;
 общедоступная переменная spiro:Spirograph = новый Spirograph(spriteLayer);

К сожалению, он всегда передается null только в класс Spirograph:

 функция Spirograph (canvasImage: Изображение): пустота 
 { 
 this.canvas = изображение холста;
 MainContainer.graphics.beginFill(0xFFFFFF);
 MainContainer.graphics.drawRect(290, 0, 670, 700);
 MainContainer.graphics.endFill();

 ui.addChild(основной контейнер);
 canvas.addChild(пользовательский интерфейс); 
}

Не уверен, что делать.

Большое спасибо.

Комментарии:

1. приношу извинения за неправильное форматирование, кажется, подсветка кода SO сейчас не работает.

2. @ALEXW При форматировании кода используйте символ «фигурной скобки», а не символ «кавычки». Я переформатировал код в вашем сообщении. Я не уверен, была ли это временная проблема, если вы не знали; но, тем не менее, похоже, что теперь все в порядке.

3. Я не совсем понимаю, в чем проблема. В вашем вопросе, похоже, смешивается MXML с ActionScript, как если бы строки выполнялись четко синхронно; когда это невозможно. Если бы вы могли предоставить более подробный контекст или код, это могло бы помочь.

4. Я попробовал использовать символ фигурной скобки. :/ Также обновил q

5. надеюсь, теперь вопрос понятен?

Ответ №1:

Я думаю, вам нужно ознакомиться с жизненным циклом гибкого компонента. Скорее всего, компонент spriteLayer еще не создан или не инициализирован при вызове new Spirograph(spriteLayer) кода. Когда вызывается этот код?

Жизненный цикл компонента Flex — это серия методов и событий, которые создают пользовательский интерфейс Flex. Вы можете переопределить эти методы или прослушать эти события, чтобы «что-то сделать». Canvas и spritelayer не будут созданы до тех пор, пока не будет вызван метод createChildren; а значения свойств по умолчанию определяются до того, как это произойдет.

Вы могли бы переопределить createChildren() и выполнить инициализацию там:

 override protected function createChildren():void{
 super.createChildren()
 spiro  = new Spirograph(spriteLayer);
}
  

или вы могли бы прослушать событие инициализации и установить там значение по умолчанию:

 <mx:MyParentComponent initialize="onInitialize()">
 <fx:Script>
   protected function onInitialize():void{
    spiro  = new Spirograph(spriteLayer);
  }
 </fx:Script>
</mx:MyParentComponent>
  

Как прокомментировал другой участник, вы также могли бы выполнить инициализацию (как указано выше) в событии creationComplete , хотя я лично не рекомендовал бы этого делать. Событие creationComplete отправляется в самом конце жизненного цикла; и, скорее всего, вносимые вами изменения приведут к «перезапуску» события рендеринга, что приведет к повторному анализу большей части жизненного цикла; размер компонента будет изменен (measure()), а элементы перемещены (updateDisplayList()). Рекомендуется устанавливать значения по умолчанию как можно раньше в жизненном цикле.

Комментарии:

1. Это действительно помогло, очень помогло … один вопрос, как мне теперь ссылаться на методы в классе с помощью события Flex (нажатие кнопки). Мне нужна кнопка для запуска метода в экземпляре spiro… Очень признателен!

Ответ №2:

для flex 4 — использовать http://docs.huihoo.com/flex/4/spark/core/SpriteVisualElement.html

ваш sprite, если это пользовательский класс, расширяющий sprite, вместо этого расширит SpriteVisualElement. В противном случае просто поместите его в UIComponent, поскольку UIComponent поддерживает addchild , в то время как с ним можно обращаться в flex, как с обычным элементом управления flex (addElement) и т.д.

Пока, например, если этот спрайт встроен во flash swc с именем символа SpriteTest. В flex вы могли бы добавить его в другой компонент, такой как soo…

в mxml поместить UIComponent, присвоить ему идентификатор … скажем, ucSpriteHolder в скрипте, var mcMySprite:Sprite = new SpriteTest(); ucSpriteHolder.addChild(mcMySprite)

Комментарии:

1. Я не использую встроенный спрайт. Должен ли я быть? Могу ли я не просто использовать библиотеку классов? Я не использую никаких разработанных символов, это все код.

2. лучший и самый простой способ для вашего класса — расширить SpriteVisualElement. Затем вы можете работать с этим в Flex точно так же, как с любым другим компонентом flex.

3. Хорошо, спасибо за информацию, я понял, что мне не следует использовать Flex, в данном случае это неподходящий инструмент для работы. Пока придерживаюсь Flash-хаков 😉

Ответ №3:

если вы делаете это public var spiro:Spirograph = new Spirograph(spriteLayer); прямо внутри <fx:Script> тега, перемещение его в обработчик событий canvas creationComplete должно помочь

Комментарии:

1. Событие Initialize — гораздо лучший выбор для его инициализации; и я объяснил, почему в моем ответе. Кажется, что большинство людей используют обработчик creationComplete в качестве переменной стиля «конструктор», хотя на самом деле это не так. В этом случае это, вероятно, заставит основные методы жизненного цикла выполняться снова, что не очень хорошо для эффективности.

2. @www.Flextras.com — я предпочитаю использовать creationComplete для случая, когда мне понадобится получить доступ к реальной ширине / высоте, рассчитанной внутри компонента. Однако, спасибо за комментарий, это полезная оптимизация для любого другого случая