FlexLoader.loadBytes (): растровое изображение загружается как MovieClip - PullRequest
1 голос
/ 07 сентября 2011

У меня есть код, который кэширует загруженные ресурсы (как изображения, так и swfs) и сохраняет свои байты во флэш-памяти 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 Мб.)

Кто-нибудь знает, как заставить FlexLoader загружать надлежащий контент?

Есть способ избежать такого поведения, но он довольно уродлив.Loaded 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 ]

1 голос
/ 09 сентября 2011

Я не использовал общий объект для хранения чего-либо, кроме текстовых данных.НО.Может быть, вы найдете здесь что-нибудь полезное: Можно ли хранить изображения в SharedObject of Flash?

В предыдущем последнем ответе содержится ссылка на пример.Кажется, подход там немного отличается от вашего.PS ссылка битая, но благодаря Google у нас есть сохраненная копия;)

1 голос
/ 07 сентября 2011

Да, я столкнулся с этой проблемой совсем недавно.Суть в том, что класс Loader может быть использован как есть, чтобы добавить свой контент к сцене, потому что он загружает экранный объект.Это не всегда удобно, однако.

Вместо этого используйте URLLoader и установите его формат данных как двоичный.После этого вы сможете получить данные правильно.Если вам абсолютно необходим FlexLoader, вы также можете загрузитьBytes () данные из URLLoader, но я не думаю, что это необходимо в вашем случае.

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
}
...