DisplayObjectContainer в компонент Flex ... как? - PullRequest
0 голосов
/ 30 апреля 2011

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

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

Все в этом классе находится внутри Sprite с именемmainContainer.Теперь я пытаюсь получить тот «mainContainer», который содержит графику для класса, во Flex-приложение.

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

Во-первых, я объявляю холст MXML с изображением внутри (как я прочитал, будет работать):

<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>}

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

            import includes.Spirograph;
            public var spiro:Spirograph = new Spirograph(spriteLayer);

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

        function Spirograph(canvasImage:Image):void
        {   
            this.canvas = canvasImage;
            mainContainer.graphics.beginFill(0xFFFFFF);
            mainContainer.graphics.drawRect(290, 0, 670, 700);
            mainContainer.graphics.endFill();

            ui.addChild(mainContainer);
            canvas.addChild(ui);
}

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

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

Ответы [ 3 ]

2 голосов
/ 30 апреля 2011

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

Компонент LifeCycle Flex представляет собой серию методов и событий, которые создают пользовательский интерфейс Flex.Вы можете переопределить эти методы или прослушать эти события, чтобы «делать вещи».Холст и 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 голос
/ 30 апреля 2011

для flex 4 - используйте http://docs.huihoo.com/flex/4/spark/core/SpriteVisualElement.html

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

Пока пример, если этот спрайт встроен во флэш-SWC с именем символа SpriteTest. В flex вы можете добавить его в другой компонент, например soo ...

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

0 голосов
/ 30 апреля 2011

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

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