如何初始化Flash ActionScript 3(AS3)组件?

4

我正在寻找正确的事件监听方式,以确保我的组件参数可用,以便初始化我的组件。

我在网上看到的大多数示例都使用附加到loaderInfo的Event.INIT。

loaderInfo.addEventListener(Event.INIT, initHandler);

根据我的经验,该事件只在电影的第一帧触发。
其他人使用Event.COMPLETE,它会在Event.INIT之后触发,以确保组件和参数可供使用。再次说明,此事件似乎只在电影的第一帧触发。这很有道理,因为它附加到组件的loaderInfo属性上。
下面是一个非常简单的组件类,它展示了我所说的内容。将此类附加到属性对话框中的电影剪辑和组件定义对话框中(不会告诉您如何制作组件,因为您可能已经知道),然后将生成的组件拖动到舞台并将“Test var”参数设置为“TEST_VAR_CHANGED”。
当您在第一帧中渲染具有组件的电影时,您将看到:
constructor null
initHandler TEST_VAR_CHANGED
completeHandler TEST_VAR_CHANGED

当您使用第二帧中的组件渲染电影时,您将只看到:
constructor null

那么,我应该监听哪个事件来确保在运行初始化处理程序之前组件参数是可用的?

组件类:

package
{
    import flash.display.MovieClip;
    import flash.events.Event;

    public class ComponentEventTest extends MovieClip
    {
        [Inspectable(name="Test var", type="String")]
        public var testVar:String;    

        function ComponentEventTest()
        {
            trace('constructor', testVar);
            loaderInfo.addEventListener(Event.INIT, initHandler);
            loaderInfo.addEventListener(Event.COMPLETE, completeHandler);
        }

        private function initHandler(evt:Event):void
        {
            loaderInfo.removeEventListener(Event.INIT, initHandler);
            trace('initHandler', testVar);
        }

        private function completeHandler(evt:Event):void
        {
            loaderInfo.removeEventListener(Event.COMPLETE, completeHandler);
            trace('completeHandler', testVar);
        }        
    }
}
1个回答

3

编辑:好的,你可以等待第一帧渲染:

监听退出帧(如果可用)(flash player 10)或进入帧

    function ComponentEventTest()
    {
        trace('constructor', testVar);
        addEventListener(Event.ENTER_FRAME, initHandler);
    }

    private function initHandler(evt:Event):void
    {
        removeEventListener(evt.type, initHandler);
        trace('initHandler', testVar);
    }

感谢您的回复。实际上,ADDED_TO_STAGE事件发生在INIT事件之前,并且也将testVar显示为null。 - shawnc
是的,我知道,我试过了,但AS2组件与AS3不同。在AS2中,您可以处理onLoad事件,一切都很顺利。AS3似乎没有明确的“我已初始化”事件,除非您侦听组件加载器,然后它仅适用于第1帧。不过还是谢谢你的尝试! :-) - shawnc
是的,你说得完全正确。我为电影剪辑可以监听的所有事件添加了侦听器,EXIT_FRAME事件是在第1帧和其他非第1帧(第2帧+)中触发的第一个事件,在这些帧中组件参数已经完全加载。有趣的是,每个人似乎都在loaderInfo对象上监听INIT或COMPLETE事件。EXIT_FRAME实际上在INIT和COMPLETE之前触发,并且组件参数已经完全加载。非常棒。谢谢! - shawnc
在您的评论中,您写道:“如果可用(Flash Player 10),则退出框架(EXIT_FRAME)”。我查看了实时文档,发现在Flash Player 9中都列出了EXIT_FRAME和ENTER_FRAME。请问您是否知道我需要注意的问题?http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/events/Event.html#EXIT_FRAME - shawnc
奇怪的是,FlashDevelop甚至在其命令完成中都没有列出EXIT_FRAME。 - shawnc
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接