DisplayObjectContainer进入Flex组件......怎么样?

时间:2011-04-29 22:19:48

标签: flash flex

我会重新写这个问题更清楚。

我正在尝试将Flash中的类文件转换为Builder。

该类中的所有内容都位于名为mainContainer的Sprite中。现在,我正在尝试将“mainContainer”用于将类的图形保存到Flex应用程序中。

这被证明是一个问题,因为他们有很多不同的方式(看起来很多谷歌搜索)。

首先我宣布一个带有图像的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>}

好的,我的计划是将spriteLayer的图片引用传递给我正在尝试运行的课程:

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

不幸的是,它只会将null传递给Spirograph类:

        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 个答案:

答案 0 :(得分:2)

我认为你需要阅读Flex Component LifeCycle。调用new Spirograph(spriteLayer)代码时,很可能尚未创建或初始化spriteLayer组件。该代码何时被称为?

Flex Component LifeCycle是一系列创建Flex UI的方法和事件。您可以覆盖这些方法,或者听这些事件来“做东西”。在调用createChildren方法之后才会创建画布和spritelayer;并且在此之前定义默认属性值。

您可以覆盖createChildren()并在那里进行初始化:

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

或者您可以收听initialize事件并在其中设置默认值:

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

正如另一张海报评论的那样,您也可以在creationComplete事件中进行初始化(如上所述),尽管我个人建议不要这样做。 creationComplete事件在生命周期的最后发送;并且很可能您正在进行的更改将导致渲染器事件“重新启动”,从而迫使生命周期的大部分时间再次解析;组件将调整大小(measure())并重新定位元素(updateDisplayList())。建议尽可能在生命周期的早期设置默认值。

答案 1 :(得分:1)

for flex 4 - 使用http://docs.huihoo.com/flex/4/spark/core/SpriteVisualElement.html

你的精灵,如果它的自定义类扩展精灵扩展SpriteVisualElement。 否则只需将其填充到UIComponent中,因为UIComponent支持addchild,而它可以像普通的flex控件(addElement)等一样在flex中处理。

到目前为止,示例是否将此精灵嵌入闪存swc中,符号名称为SpriteTest。在flex中,您可以将其添加到另一个组件,如soo ......

在mxml中放一个UIComponent,给它一个id ...比如说ucSpriteHolder 在脚本中,var mcMySprite:Sprite = new SpriteTest(); ucSpriteHolder.addChild(mcMySprite)

答案 2 :(得分:0)

如果您在public var spiro:Spirograph = new Spirograph(spriteLayer);标记内正在<fx:Script>,请将其移至画布creationComplete事件处理程序中帮助