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