Actionscript 3 子对象中的AS3事件处理程序未启动

Actionscript 3 子对象中的AS3事件处理程序未启动,actionscript-3,Actionscript 3,也许我在学习AS3和事件处理的过程中错过了一些要点。无论如何,加载程序的完整事件(onLoad)不会在imgManager对象中为加载程序触发。如果我在主类中复制相同的代码,并要求它从内部触发相同的事件,那么它就可以正常工作。这是我的密码: public class ImageScroller extends Sprite { public function ImageScroller() { var imgMan:ImageManager = new Image

也许我在学习AS3和事件处理的过程中错过了一些要点。无论如何,加载程序的完整事件(onLoad)不会在imgManager对象中为加载程序触发。如果我在主类中复制相同的代码,并要求它从内部触发相同的事件,那么它就可以正常工作。这是我的密码:

public class ImageScroller extends Sprite
{
    public function ImageScroller()
    {
        var imgMan:ImageManager = new ImageManager();
        var v:Vector.<String> = new Vector.<String>();
        v[0] = "../assets/apache_pb.gif";

        imgMan.LoadImages(v);

        addChild(imgMan.loadedImages[0]);
    }

}

public class ImageManager
{
    public var _loader:Loader;
    private var _urlRequest:URLRequest;
    private var _loadedImages:Vector.<Bitmap>;

    public var bo:Boolean = false;

    public function ImageManager()
    {
        _loader = new Loader();

        _loadedImages = new Vector.<Bitmap>();
    }

    public function LoadImages(v:Vector.<String>):void
    {

        for(var i:int = 0; i < v.length;i++)
        {
            _loader.load(new URLRequest(v[i]));
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
        }

    }

    private function onLoad(e:Event):void
    {
        bo = true;
        var bmp:Bitmap = (Bitmap)(e.target.content);
        _loadedImages[0] = bmp;
    }

    public function get loadedImages():Vector.<Bitmap>
    {
        return _loadedImages;
    }
}
公共类ImageScroller扩展了Sprite
{
公共函数ImageScroller()
{
var imgMan:ImageManager=new ImageManager();
变量v:向量。=新向量。();
v[0]=“./assets/apache_pb.gif”;
imgMan.LoadImages(v);
addChild(imgMan.loadedImages[0]);
}
}
公共类图像管理器
{
公共变量加载器:加载器;
私有变量urlRequest:urlRequest;
私有变量加载图像:向量。;
公共变量bo:Boolean=false;
公共功能ImageManager()
{
_加载器=新加载器();
_LoadeImage=新向量。();
}
公共函数LoadImages(v:Vector.):void
{
对于(变量i:int=0;i

}

我重写了您的代码,相信以下是解决您问题的方法:

Main.as:

package
{
    import flash.display.Sprite;

    public class Main extends Sprite
    {
        public function Main()
        {
            init();

        }// end function

        private function init():void
        {
            var imageScroller:ImageScroller = new ImageScroller("images/image1.jpg",
                                                                "images/image2.jpg",
                                                                "images/image3.jpg");
            addChild(imageScroller);

        }// end function

    }// end class

}// end package
ImageScroller.as

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

    public class ImageScroller extends Sprite
    {
        private var _urls:Array;
        private var _imageManager:ImageManager;

        public function ImageScroller(...urls:Array)
        {
            _urls = urls;

            init();

        }// end function

        private function init():void
        {
            _imageManager = new ImageManager();
            _imageManager.load(_urls);
            _imageManager.addEventListener(Event.COMPLETE, onImageManagerComplete);

        }// end function

        private function onImageManagerComplete(e:Event):void
        {
            addChild(_imageManager.bitmaps[0]);

        }// end function

    }// end class

}// end package
ImageManager.as

package
{   
    import flash.display.Bitmap;
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.net.URLRequest;

    public class ImageManager extends EventDispatcher
    {
        private var _urls:Array;
        private var _bitmaps:Vector.<Bitmap>;
        private var _loadedBitmapCount:int;

        public function get bitmaps():Vector.<Bitmap>     
        {       
            return _bitmaps;  

        } // end function

        public function ImageManager()     
        {
            init();

        }// end function 

        public function load(urls:Array):void   
        {
            for each(var url:* in urls)
            {
                if(!(url is String))
                throw new ArgumentError("Arguments must be of type String");

            }// end for

            _urls = urls;

            for(var i:int = 0; i < _urls.length; i++)  
            {    
                var loader:Loader = new Loader();
                loader.load(new URLRequest(_urls[i]));     
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);    

            }  // end for 

        } // end function

        private function init():void
        {
            _bitmaps = new Vector.<Bitmap>();

        }// end function

        private function onLoaderComplete(e:Event):void 
        {   
            if(++_loadedBitmapCount >= _urls.length)
            {
                dispatchEvent(new Event(Event.COMPLETE));

            }// end if

            var bitmap:Bitmap = (Bitmap)(e.target.content); 
            bitmaps.push(bitmap);

        }// end function

    }// end class

}// end package
您需要的是一个事件侦听器,它将侦听
ImageManager
对象在加载所有图像后发送事件。为此,我首先将您的
ImageManager
类从
对象更改为
EventDispatcher

public class ImageManager extends EventDispatcher
现在,
ImageManager
具有分派事件和侦听事件所需的两种方法,分别是
dispatchEvent()
addEventListener()
方法

接下来,我更改了代码,这样条件将测试在事件侦听器调用
加载程序时,每次调用
onLoaderComplete
事件处理程序时加载的所有图像是否都是对象。这是在
\u loadedBitmapCount
integar属性的帮助下完成的,该属性在每次调用时递增,然后根据
\u URL
数组属性的长度属性测试其值。当满足条件时,
ImageManager
EventDispatcher
对象将调用其
dispatchEvent()
方法并分派一个
事件。完成
事件对象

public function load(urls:Array):void   
{
    // ...

    for(var i:int = 0; i < _urls.length; i++)  
    {    
        var loader:Loader = new Loader();
        loader.load(new URLRequest(_urls[i]));     
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);    

    }  // end for 

} // end function

//...

private function onLoaderComplete(e:Event):void 
{   
    if(++_loadedBitmapCount >= _urls.length)
    {
        dispatchEvent(new Event(Event.COMPLETE));

    }// end if

}// end function

如果您有什么不明白或想问我的,请在回答中添加评论。

嘿,谢谢。我不明白为什么我需要为主类添加一个事件侦听器。嘿,谢谢。有几件事。1.为什么我需要在主类上放置一个事件侦听器?2.事件是否跨越多个类?在上面的例子中,ImageManager有一个loader对象,它生成完整的事件。ImageScroller是否可以看到完整事件(由loader对象引起),还是仅包含在ImageManager类中?3.根据上面的答案,上面的dispatchEvent是否只在ImageScroller类的上下文中运行,而不是在Main中运行?例如,我已经更新了我的答案,以尽我所能回答您提出的问题,但有些问题我无法回答,因为我不知道如何正确回答。我建议用谷歌搜索“flash中的事件流”,这正是你的问题所在。我确实在另一个问题中做了部分解释,你可以在这里找到。
public function load(urls:Array):void   
{
    // ...

    for(var i:int = 0; i < _urls.length; i++)  
    {    
        var loader:Loader = new Loader();
        loader.load(new URLRequest(_urls[i]));     
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);    

    }  // end for 

} // end function

//...

private function onLoaderComplete(e:Event):void 
{   
    if(++_loadedBitmapCount >= _urls.length)
    {
        dispatchEvent(new Event(Event.COMPLETE));

    }// end if

}// end function
private function init():void
{
    _imageManager = new ImageManager();
    _imageManager.load(_urls);
    _imageManager.addEventListener(Event.COMPLETE, onImageManagerComplete);

}// end function

private function onImageManagerComplete(e:Event):void
{
    addChild(_imageManager.bitmaps[0]);

}// end function