0

我正在学习 ActionScript 3.0,我经常看到这种范例:

package util
{
    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.net.URLRequest;
    import flash.events.Event;

    public class BitmapLoader extends Sprite
    {
        private var loader:Loader = new Loader();

        private var filePath:String;

        public function BitmapLoader(filePath)
        {
            this.filePath = filePath;

            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeListener);
        }

        public function load():void
        {
            loader.load(new URLRequest(filePath));
        }

        private function completeListener(event:Event):void
        {
            addChild(loader);
        }
    }
}

我想做的是取回对象,而不是将加载器视为DisplayObject。我将发布我的理想化版本,希望它能最好地解释我想做的事情。

package util
{
    import flash.display.Bitmap;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.net.URLRequest;
    import flash.events.Event;

    public class BitmapLoader
    {
        private var hasLoaded:Boolean = false;
        private var loader:Loader = new Loader();

        private var filePath:String;
        private var bitmap:Bitmap;

        public function BitmapLoader(filePath)
        {
            this.filePath = filePath;

            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeListener);
        }

        public function load():Bitmap
        {
            loader.load(new URLRequest(filePath));

            while(!hasLoaded);

            return bitmap;
        }

        private function completeListener(event:Event):void
        {
            bitmap = new Bitmap(Bitmap(LoaderInfo(event.target).content).bitmapData);
            hasLoaded = true;
        }
    }
}

我缺少的是为什么 while 循环永远不会退出。无论如何,这是我想要完成的事情,所以请随时修改我的示例或发布您喜欢的方法。谢谢!

4

2 回答 2

1

这是不恰当的:

bitmap = new Bitmap(Bitmap(LoaderInfo(event.target).content).bitmapData);

这是正确的(请注意此示例中缺少new ):

bitmap = Bitmap(loader.content);

就 while 循环而言,您正在冻结该行上的 Flash Player。Flash 是单线程的,在您的 while 子句之后发生的所有事件都不会发生。它坐在那里等待循环中断,这永远不会发生,因为循环中没有任何东西可以打破它。这是 AVM 的限制。

这是一个扩展的例子。

于 2009-08-15T06:24:31.280 回答
0

您不能拥有此代码:

public function load():Bitmap
{
    loader.load(new URLRequest(filePath));

    // this line can *never* work
    while(!hasLoaded);

    return bitmap;
}

不能从加载命令返回位图。您必须在请求加载和编写异步代码后退出该函数。

基本上,你需要写的是:

  1. 请求负载
  2. 等待completeListener回调
  3. 使用位图

所以这应该是:

public function load():void
{
    loader.load(new URLRequest(filePath));

    // remember you cannot return a Bitmap now.
    // It hasn't loaded yet. You can't wait in here
    // so just return.
}

private function completeListener(event:Event):void
{
    bitmap = new Bitmap(Bitmap(LoaderInfo(event.target).content).bitmapData);

    // HERE the bitmap is *now* available
    // you now need to tell your app that it is available so it can use it.
}
于 2009-08-15T14:51:13.167 回答