FlexLoader.loadBytes():位图作为MovieClip加载

时间:2011-09-07 09:23:14

标签: flash flex actionscript-3 bitmap movieclip

我有一个代码,它缓存加载的资源(包括图像和swfs)并将其字节保存到flash SharedObject

var cache:SharedObject = SharedObject.getLocal('dataCache');
cache.data[url] = (loader.contentLoaderInfo as LoaderInfo).bytes;

当有查询加载新资源时,代码会检查资源是否在缓存中,然后加载其字节:

var loader:FlexLoader = new FlexLoader();
// handlers skipped
var lc:LoaderContext = new LoaderContext();
lc.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);

if (cache && cache.data[url])
    loader.loadBytes(cache.data[url], lc)
else
    loader.load(new URLRequest(url), lc);

问题:有时FlexLoader.loadBytes()将PNG和JPG加载为MovieClip 。即当我在完整事件中查看loader.content时,我看到了MovieClip,而在loader.contentLoaderInfo.contentType中有“application / x-shockwave-flash”。 (有时意味着在大多数计算机上都会重现这样的行为,并且只有在“.sol”文件超过9 Mb之后才会重现。)

有谁知道如何让FlexLoader加载适当的内容?

有一种黑客可以避免这种行为,但它非常难看。已加载的MovieClip内部只有一个孩子 - 所需的Bitmap,因此我可以检查资源类型并提取图形:

public function getAsBitmap(imgName:String):Bitmap
{
    var res:Object = getResource(imgName);
    if (res is MovieClip)
    {
        try
        {
            return (res as MovieClip).getChildAt(0) as Bitmap;
        }
        catch(e:*) {}
    }
    return res as Bitmap;
}

2 个答案:

答案 0 :(得分:1)

是的,我最近偶然发现了这个问题。事情是Loader类可以原样用于将其内容添加到场景中,因为它加载了一个显示对象。然而,这并不总是方便的。

请改用URLLoader并将其数据格式设置为二进制。然后,您就可以正确获取数据。如果你绝对需要FlexLoader,你也可以从URLLoader中加载Bin()数据,但我不认为你的情况是必要的。

private function loadFromDisk(url:String, loader:Loader):void
{
    var urlLoader:URLLoader = new URLLoader();
    var urlRequest:URLRequest = new URLRequest(url);

    urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
    urlLoader.addEventListener(Event.COMPLETE, loadComplete, false, 100, true);
    urlLoader.load(urlRequest);
}

private function loadComplete(event:Event):void
{
    var urlLoader:URLLoader = URLLoader(event.target);
    imageBytes:ByteArray = urlLoader.data; //here's your data!
    flexLoader.loadBytes(imageBytes); //useless here, just to show you it's possible
}

答案 1 :(得分:1)

我没有使用Shared对象来存储除文本数据之外的任何内容。但。也许你可以在这里找到有用的东西:Is it possible to store images in the SharedObject of Flash?

前一个答案包含一个示例的链接。看起来那里的方法与你的有点不同。 附:该链接已损坏,但感谢Google,我们已保存了副本;)