【问题标题】:AS3 image loading content is always nullAS3 图片加载内容始终为空
【发布时间】:2014-03-02 18:22:28
【问题描述】:

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

有什么想法吗???我还包括了我的事件监听器,它确实启动了。

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

提前致谢!

【问题讨论】:

    标签: actionscript-3 flash image-loading


    【解决方案1】:

    我很确定这是因为加载器异步工作

    正确

    但我不知道如何修改它以便能够从函数中返回图像

    没有办法做到这一点。

    为什么?

    因为它是异步的。

    您不能在请求发出后立即返回请求的结果。

    代码的执行不会暂停并等待响应返回,因此您的函数将在您获取数据之前执行 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 );
    

    假设您一次只加载一个图像(因为您的方法是静态的),这应该可以工作,否则您将需要实现某种请求队列处理。

    我希望这会有所帮助。

    【讨论】:

    • 您的解释是 100%,但您的代码示例有一个小缺陷 - loadImage 无法返回任何内容 :-)
    • @Marty 感谢您的编辑和评论。抱歉:) 自 2012 年 12 月以来我没有碰过 as3,只是尽力不忘记一切,如果您不介意,请随时编辑此答案:)
    • 我想这是一个好的开始。我想知道如何让 loadImage 返回我想要的数据,我认为唯一的方法是停止执行函数,直到加载数据。这不是完美的解决方案,但我找不到更适合我需要的解决方案。你认为这是可以接受的吗? (然后我会放 while 循环检查内容是否与 null 不同?)
    • 如果有什么不同,它不一定是静态的。
    • 然后再问一个问题
    【解决方案2】:

    你得到一个'null',因为你太早提到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);
    }
    

    你可以把它放回适合你的课程的形式。

    【讨论】:

    • 就像我说的,我必须从我的函数内部返回 BitmapData,因为它在我的整个应用程序中全局使用。这对我来说根本解决不了任何问题。
    • 你当然没有在你的问题中说“从函数内部”。如果你问一个更好的问题,你会得到一个更好的答案!将 BitmapData 实例设为静态变量,您可以全局访问它。
    • "但我不知道如何修改它以便能够从函数中返回图像。"。
    • 好吧,我们已经解决了“空”问题。你到底想“修改”什么?你能清楚地解释一下你想在哪里或如何使用这张图片吗?
    • 好的,这是来自 AssetsLoader 类的函数。这是一个类,我使用 的函数来加载我的应用程序中使用的所有图像(顺便说一下声音文件)。所以我在一个不同的类中做什么:var bitmap:Bitmap = new Bitmap(AssetsLoader.loadImage(path)); 这应该会导致从外部源加载图像,返回一个BitmapData 并基于其他类中的数据创建一个新的位图。因此,在函数loadImage 中,我必须使用加载器加载它并返回已加载的BitmapData - 从该函数内部。
    【解决方案3】:

    你应该说:

    var bitmapData:BitmapData; 
    

    var image:Bitmap = new Bitmap(event.target.content.bitmapData)
    

    而不是

    var image:Bitmap = new Bitmap((loader.content as BitmapData));
    

    【讨论】:

    • 我真的很抱歉,但我可以看到任何对我有帮助的方法。根本解决不了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多