Может ли обработчик событий вернуть значение? - PullRequest
0 голосов
/ 19 февраля 2010

Я пытаюсь написать класс, который его конструктор принимает в качестве аргумента String (который является изображением в моем каталоге, например: jpg), и загрузить соответствующее изображение через объект загрузчика в памяти. Я также предоставляю функцию getBitmapFromLoader (), чтобы получить растровое изображение загрузчика и использовать его из другого класса.

public class LoadImage extends Loader
{
    private var bitmap:Bitmap;
    private var ldr:Loader;

    public function LoadImage(nameURL:String):void
    {
        trace("LoadImage constructor");
        ldr = new Loader();
        ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
        ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorEventHandler);
        var request:URLRequest = new URLRequest(nameURL);
        ldr.load(request);
    }

    /* methods */
    public function getBitmapFromLoader():Bitmap
    {
        return bitmap;
    }

    public function toSprite():Sprite
    {
        trace("toSprite method");
        var sprite:Sprite = new Sprite();
        sprite.addChild(bitmap);
        return sprite;
    }

    public function toMovieClip():MovieClip
    {
        trace("toMovieClip method");
        var mvc:MovieClip = new MovieClip();
        mvc.addChild(bitmap);
        return mvc;
    }

    private function completeHandler(event:Event):void
    {
        trace("completeHandler " + event.currentTarget);
        bitmap = new Bitmap();
        bitmap = Bitmap(event.currentTarget.content);
    }

    private function ioErrorEventHandler(event:IOErrorEvent):void
    {
        trace("ioErrorEventHandler " + event.currentTarget);
        trace("error on loading image: " + event.currentTarget.url);
        bitmap = null;
    }
}
}

но это не работает. Вот что выводит вспышка: Main constructor LoadImage constructor toSprite method TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChild() at loader::LoadImage/toSprite() at Main() completeHandler [object LoaderInfo]

Вот как я использую его из основного класса: package { import loader.*;</p> <pre><code>import flash.display.MovieClip; import flash.display.Sprite; public class Main extends MovieClip { /* properties */ /* constructor */ public function Main():void { trace("Main constructor"); var imgLdr:LoadImage = new LoadImage("smile_bg.jpg"); var spr1:Sprite = imgLdr.toSprite(); //this.width = spr1.width; //this.height = spr1.height; this.addChild(spr1); } /* methods */ }

}

1 Ответ

1 голос
/ 19 февраля 2010

Ну, Loader сам по себе является DisplayObject - так что вы можете просто добавитьChild (event.currentTarget), и он будет отображаться просто отлично.Он расширяет DisplayObjectContainer так же, как это делает Sprite.

Если вам буквально требуется растровое изображение, вы можете сделать что-то вроде:

var bmd:BitmapData = new BitmapData(event.currentTarget.width, event.currentTarget.height);
bmd.draw(event.currentTarget);
bitmap = new Bitmap(bmd);

И сделать это таким образом.Возможно, вам придется немного подправить, что я ухожу из памяти.

Если у вас когда-либо возникают проблемы с Display API, это очень хорошая диаграмма, чтобы подвести итог, что живет, где и как различные экранные объектыдети связаны: http://accad.osu.edu/~pgerstma/class/pca/resources/as3API/AS3API-flash.display.png

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...