我为我的Flash应用创建的资源加载器出了问题。在函数中,我尝试加载外部图像并从此函数返回。我的问题是我总是将loader.content设置为null。我的代码如下所示:
public static function loadImage(path:String):BitmapData
{
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, check);
if (path == "")
loader.load(new URLRequest("images/default.png"));
else
loader.load(new URLRequest("images/" + path));
var image:Bitmap = new Bitmap((loader.content as BitmapData));
return image.bitmapData;
}
public static function check(e:Event):void
{
trace("Loading completed");
e.target.removeEventListener(Event.COMPLETE, check);
}
任何想法????我还包括我的事件监听器,它确实启动了。
我很确定这是因为加载程序异步工作,但我不知道如何修改它以便能够从函数返回图像。
提前致谢!
答案 0 :(得分:4)
我很确定这是因为加载程序异步工作
正确
但我不知道如何修改它以便能够从函数
返回图像
没有办法做到这一点。
为什么?
因为它是异步的。
请求完成后,您无法直接返回请求的结果。
代码的执行不会暂停并等待响应返回,因此您的函数将在获取数据之前点击return语句,这就是它返回null
的原因。
处理此问题的唯一方法是侦听响应(Event.COMPLETE)并在收到服务器响应后运行回调函数。
因此,按照您的代码示例,您可以执行以下操作:
private static var _callback :Function;
public static function loadImage(path:String, callback:Function):void
{
_callback = callback;
// ....
然后:
public static function check(e:Event):void
{
// ...
_callback( whateverYouWantToReturnGoesHere );
假设您一次只加载一个图像(因为您的方法是静态的),这应该可以工作,否则您将需要实现某种请求队列处理。
我希望这会有所帮助。
答案 1 :(得分:0)
你得到'空',因为你过早地指的是loader.content
。这是一个简化的版本,可以在时间轴中正常工作:
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, check);
loader.load(new URLRequest("images/default.png"));
function check(e:Event):void
{
var bmd:BitmapData = new BitmapData(195,130,false,0xFFFFFFFF)
var image:Bitmap = new Bitmap(bmd);
bmd.draw(loader.content);
trace(loader.content);
trace("Loading completed");
addChild(image);
e.target.removeEventListener(Event.COMPLETE, check);
}
您可以将其放回适合您班级的表格。
答案 2 :(得分:0)
你应该说:
var bitmapData:BitmapData;
和
var image:Bitmap = new Bitmap(event.target.content.bitmapData)
而不是
var image:Bitmap = new Bitmap((loader.content as BitmapData));