Adobe Flex: Event.COMPLETE для изображения не запускается при загрузке изображения из растрового изображения - PullRequest
1 голос
/ 12 января 2010

У меня странная проблема. Я могу заставить Event.COMPLETE срабатывать при установке

image.source = byteArray;

НО

Когда я манипулирую byteArray - преобразую его в Bitmap и использую image.source или image.load, чтобы загрузить его, растровое изображение корректно загружается в компонент Image; НО Event.COMPLETE никогда не срабатывает. Что здесь может быть не так? Я добавил список событий для завершения тоже! Мой источник выглядит следующим образом:

                var bmp:Bitmap = scaleBitmapData(bitmapData,280,220);
                imgPreview.addEventListener(Event.COMPLETE,onPreviewImageCompleted); // never fires
                imgPreview.visible = false;
                imgPreview.load(bmp); // does not work with .source either; image is displayed but Event.Complete never fires!

Спасибо Subrat

1 Ответ

2 голосов
/ 12 января 2010

Таким образом, класс в игре здесь SWFLoader (изображение расширяет SWFLoader). Если вы передали ByteArray или URL, то он добавляет соответствующего слушателя. То, что вы сделали, это загрузили растровое изображение, которое является экранным объектом. Вот важный код, который загружает растровое изображение в изображение:

 else if (classOrString is DisplayObject)
 {
     contentHolder = child = DisplayObject(classOrString);
     addChild(child);
     contentLoaded();
 }

ByteArray:

else if (byteArray)
{
    loader = new FlexLoader();
    contentHolder = child = loader;
    addChild(child);

    loader.contentLoaderInfo.addEventListener(
        Event.COMPLETE, contentLoaderInfo_completeEventHandler);
    loader.contentLoaderInfo.addEventListener(
        Event.INIT, contentLoaderInfo_initEventHandler);
    loader.contentLoaderInfo.addEventListener(
        IOErrorEvent.IO_ERROR, contentLoaderInfo_ioErrorEventHandler);
    loader.contentLoaderInfo.addEventListener(
        Event.UNLOAD, contentLoaderInfo_unloadEventHandler);

    // if loaderContext null, it will use default, which is AppDomain
    // of child of Loader's context
    loader.loadBytes(byteArray, loaderContext);
}

URL:

else if (url)
{
    // Create an instance of the Flash Player Loader class to do all the work
    loader = new FlexLoader();
    contentHolder = child = loader;

    // addChild needs to be called before load()
    addChild(loader);

    // Forward the events from the Flash Loader to anyone
    // who has registered as an event listener on this Loader.
    loader.contentLoaderInfo.addEventListener(
        Event.COMPLETE, contentLoaderInfo_completeEventHandler);
    loader.contentLoaderInfo.addEventListener(
        HTTPStatusEvent.HTTP_STATUS, contentLoaderInfo_httpStatusEventHandler);
    loader.contentLoaderInfo.addEventListener(
        Event.INIT, contentLoaderInfo_initEventHandler);
    loader.contentLoaderInfo.addEventListener(
        IOErrorEvent.IO_ERROR, contentLoaderInfo_ioErrorEventHandler);
    loader.contentLoaderInfo.addEventListener(
        Event.OPEN, contentLoaderInfo_openEventHandler);
    loader.contentLoaderInfo.addEventListener(
        ProgressEvent.PROGRESS, contentLoaderInfo_progressEventHandler);
    loader.contentLoaderInfo.addEventListener(
        SecurityErrorEvent.SECURITY_ERROR, contentLoaderInfo_securityErrorEventHandler);
    loader.contentLoaderInfo.addEventListener(
        Event.UNLOAD, contentLoaderInfo_unloadEventHandler); 
...[this goes on for awhile]

Итак, вы поняли суть здесь. Не конвертируйте его в растровое изображение, и вы получите полное событие. Вы также можете добавить ADDED_TO_STAGE в ваше растровое изображение.

...