Actionscript 3 as3 addEventListner在另一个类中的函数上

Actionscript 3 as3 addEventListner在另一个类中的函数上,actionscript-3,function,class,addeventlistener,Actionscript 3,Function,Class,Addeventlistener,我有一个类在另一个类中调用函数。我想知道 如果我们可以添加一个事件侦听器,以了解该函数是否已启动并已完成等 以下是代码的相关部分 myMC = new pictures(); addChild(myMC); myMC.loadImages("Joyful",1) // Add Event Listener here to let me know loadImages was called and worked. 如您所见,函数名为loadImages(),它位于名为pictures.As的

我有一个类在另一个类中调用函数。我想知道 如果我们可以添加一个事件侦听器,以了解该函数是否已启动并已完成等

以下是代码的相关部分

myMC = new pictures(); 
addChild(myMC);
myMC.loadImages("Joyful",1)
// Add Event Listener here to let me know loadImages was called and worked. 
如您所见,函数名为loadImages(),它位于名为pictures.As的类中

我可以添加一个事件侦听器吗

这是一个新问题。我正在使用类似的方法,我使用了下面的示例,但它不起作用。我是不是错过了什么重要的东西?我只是展示了相关的功能,而不是我的整个脚本

主类 包裹 {

}//端包

viewLanguages.as

包com.views

package com.views
{

    import flash.display.MovieClip;
    import flash.filesystem.File;
    import com.roundFlag;
    import flash.events.*;
    import flash.display.*;


    public class viewLanguages extends MovieClip
    {

        var Flag:MovieClip;
        //public static const FLAGS_LOADED:String = "flagsLoaded"; 
        public function viewLanguages()
        {
            getLang();
        }


        function numCheck(num:int):Boolean
        {
            return (num % 2 != 0);
        }
        /// Get for App Opening
        public function getLang()
        {
            /// When Live
            var folderLanguages:File = File.applicationStorageDirectory.resolvePath("Languages");
            var availLang = folderLanguages.getDirectoryListing();
            var Lang = new Array();
            var LangPath = new Array();
            var fl:int = 0;
            for (var i:uint = 0; i < availLang.length; i++)
            {

                if (availLang[i].isDirectory)
                {
                    //flag = new Loader();
                    //flag.load(new URLRequest(File.applicationStorageDirectory.url + "Languages/" + Lang[i] + "/roundFlag.png"));


                    Lang.push(availLang[i].name);
                    LangPath.push(availLang[i].nativePath);
                    Flag = new roundFlag(availLang[i].name);
                    Flag.name = availLang[i].name;

                    if (numCheck(i)==false)
                    {
                        Flag.y = fl;
                        Flag.x = 0;

                    }
                    else
                    {
                        Flag.y = fl;
                        Flag.x = Flag.width + 33;
                        fl = fl + Flag.height + 33;
                    }

                    Flag.btext.text = availLang[i].name;
                    addChild(Flag);


                    trace(availLang[i].nativePath);// gets the name
                    trace(availLang[i].name);

                }
            }
            trace("Get Lang Called");
            dispatchEvent(new Event("MyEvent"));
        }



    }

}
package.com.views
{
导入flash.display.MovieClip;
导入flash.filesystem.File;
导入com.roundFlag;
导入flash.events.*;
导入flash.display.*;
公共类viewLanguages扩展了MovieClip
{
var标志:MovieClip;
//加载的公共静态常量标志:String=“flagsLoaded”;
公共函数viewLanguages()
{
getLang();
}
函数numCheck(num:int):布尔值
{
返回(数值%2!=0);
}
///获取应用程序的打开时间
公共函数getLang()
{
///活着的时候
var folderLanguages:File=File.applicationStorageDirectory.resolvePath(“语言”);
var availlanguage=folderLanguages.getDirectoryListing();
var Lang=新数组();
var LangPath=新数组();
var-fl:int=0;
对于(变量i:uint=0;i
是的,你可以。考虑到您正在将剪辑添加到显示列表中,我假设它扩展了Movieclip或Sprite,两者都扩展了EventDispatcher。在pictures类中,您可以简单地使用
dispatchEvent(新事件(“MyEvent”);
来分派事件。然后您可以添加
myMC.addEventListener(“MyEvent”,eventHandler”);
来对其作出反应

您也不应该对我上面写的事件使用字符串。如果您在pictures类中声明了一个
公共静态常量IMAGES\u LOADED:String=“imagesLoaded”
,则会更好。然后您应该通过调度和侦听来使用此常量

编辑:这里是常量的外观:

//your class
package {

    import flash.events.Event;
    import flash.display.Sprite;

    public class Pictures extends Sprite {

        public static const IMAGES_LOADED:String = "imagesLoaded"; 

        public function Pictures() {

        }

        public function onAllImagesLoaded():void {
            dispatchEvent(new Event(IMAGES_LOADED));
        }
        //rest of your methods
    }
}

//you would call it like this:
var myMc:Pictures = new Pictures();
myMc.addEventListener(Pictures.IMAGES_LOADED, onImagesLoaded);
myMc.loadImages();

function onImagesLoaded(e:Event):void {
    //...etc
}

您必须创建自定义事件类才能使其工作。例如:

package com.some
{

    import flash.events.Event;

    public class SomeEvent extends Event
    {

        // Loading events
        public static const MAINDATA_LOADING:String = "onMainDataLoading";
        // Other event
        public static const SOME_LOADING:String = "onSomeLoading";      


        public var params:Object;

        public function SomeEvent($type:String, $params:Object, $bubbles:Boolean = false, $cancelable:Boolean = false)
        {
            super($type, $bubbles, $cancelable);
            this.params = $params;
        }

        public override function clone():Event
        {
            return new SomeEvent(type, this.params, bubbles, cancelable);
        }

    }

}
在想要的类(图片)中添加事件分派,并将想要的参数传递给事件(此或任何其他)

处理事件侦听:

var myMc:Pictures = new Pictures();
myMc.addEventListener(SomeEvent.IMAGES_LOADED, onImagesLoaded);
myMc.loadImages();

function onImagesLoaded(e:SomeEvent):void {
   // handle event.
   var picts:Pictures = (e.params as Pictures);
}

你能举一个你建议的第二个选项的例子吗?使用static const等?太棒了,我在一个例子中让它工作了,但在上面的一个例子中它没有调用。关于为什么不这样做,有什么想法吗?感谢你在没有看到你的代码的情况下很难说。确保你的类扩展了EventDispatcher(或者扩展了扩展了EventDispatcher的某个类)或者实现IEventDispatcher接口。还要确保您的dispatchEvent实际触发-在它之前/之后放置跟踪语句并检查输出。好的,我发布了完整的代码。我想我之前发布了重要的内容,但现在是完整的代码。要筛选的内容很多,但我希望您能找到我之前发布的主要函数。我可能是m可能像您建议的那样取消导入。仅通过读取代码很难看到代码中发生了什么,但您正在从viewLanguages的构造函数中调度事件(您正在调用其中的getLang()来调度事件)。如果您创建它的新实例,它会立即分派事件而不实际侦听它:var vl:viewLanguages=new viewLanguages();vl.addEventListener(…)->构造函数会在调用addEventListener之前触发事件。这不是问题吗?关于这个XML问题有什么想法吗?真让我烦透了!
dispatchEvent(new SomeEvent(SomeEvent.IMAGES_LOADED, this));
var myMc:Pictures = new Pictures();
myMc.addEventListener(SomeEvent.IMAGES_LOADED, onImagesLoaded);
myMc.loadImages();

function onImagesLoaded(e:SomeEvent):void {
   // handle event.
   var picts:Pictures = (e.params as Pictures);
}