AS3图像加载内容始终为null

时间:2014-03-02 18:22:29

标签: actionscript-3 flash image-loading

我为我的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);
    }

任何想法????我还包括我的事件监听器,它确实启动了。

我很确定这是因为加载程序异步工作,但我不知道如何修改它以便能够从函数返回图像。

提前致谢!

3 个答案:

答案 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));