事件处理程序可以返回值吗?

时间:2010-02-19 14:10:54

标签: flash actionscript-3

我正在尝试编写一个类,其构造函数将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.*;

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 */

}

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 个答案:

答案 0 :(得分:1)

好吧,一个Loader本身就是一个DisplayObject - 所以你可以只使用addChild(event.currentTarget)它就会很好地显示出来。它像Sprite一样扩展DisplayObjectContainer。

如果您确实需要一个Bitmap,那么您可以执行以下操作:

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