as3:重新加载图像

时间:2009-12-29 04:54:18

标签: flex actionscript-3

我有一个我试图加载的图像,然后重新加载。这是我加载图像的代码:

    public function loadImage(url:String, _w:int, _h:int):void 
    {   
        this._stwidth = _w;
        this._stheight = _h;
        this._imageURL = url;

        if(!_imageURL)
        {
            return;
        }

        this.alpha = 1.0;   //need this because we might have just faded the image out

        _ldr.alpha = 0.0;
        _prog.alpha = 1.0;
        _sqr.alpha = 0.0;
        _sqr.graphics.clear();

        if(_hasLoaded) 
        {
            try
            {
                _ldr.close();
                _ldr.unload();                  
            }
            catch(e:Error)
            {
                //trace("bmdisplay has loaded once, but there was an error: " + e.message);
            }           
        }

        _ldr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
        _ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
        _ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
        _ldr.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
        _ldr.contentLoaderInfo.addEventListener(Event.INIT, onOpen);
        _ldr.load(new URLRequest(_imageURL));
    }

出于某种原因,此代码在第二次加载时不会在未发出错误的情况下加载图像。 有人可以帮我解决这个问题吗?

我完全迷失了为什么我的变量_asLoaded会让我错误。 我有一个onComplete()处理程序,它将var设置为true,之后我从未将它设置为false。

我不知道还有什么我应该尝试的......

由于

3 个答案:

答案 0 :(得分:2)

有时回来我写了一个帮助类来实现类似的东西。辅助类扩展了Loader并提供了图像的自动缩放。以下是该类的代码:

package {
import flash.display.Loader; import flash.geom.Rectangle; import flash.net.URLRequest; import flash.events.Event; import flash.events.IOErrorEvent; import flash.events.SecurityErrorEvent; public class ImageLoader extends Loader { private var _imageURL:String; // URL of image private var _imageBoundary:Rectangle; // boundary rectangle for the image private var _loaded:Boolean; // flag which tells whether image is loaded or not. private var _isLoading:Boolean; // flag which say if any loading is in progress //Constructor function, which calls Loader's constructor // and loads and resize the image public function ImageLoader(url:String = null, rect:Rectangle = null):void { super(); _imageURL = url; _imageBoundary = rect; _loaded = false; _isLoading = false; loadImage(); } // sets the image for the loader and loads it public function set imageURL(url:String):void { _imageURL = url; loadImage(); } // sets the boundary of the image and resizes it public function set boundary(rect:Rectangle):void { _imageBoundary = rect; resizeImage(); } private function removeListeners():void { this.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete); this.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onError); this.contentLoaderInfo.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); } private function onComplete(e:Event):void { _loaded = true; _isLoading = false; removeListeners(); resizeImage(); } //In case of error, we are not propogating the event private function onError(e:Event):void { e.stopImmediatePropagation(); removeListeners(); } // real loading goes here // it first closes and unloads the loader and // then loads the image private function loadImage():void { if (_isLoading) { trace("Some loading is in progess"); return; } try { this.close(); this.unload(); } catch(e:Error) { //discarded } if (!_imageURL) return; _loaded = false; _isLoading = true; this.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); this.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError); this.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); this.load(new URLRequest(_imageURL)); } // standard resizing function for image so that it's // aspect ratio is maintained. private function resizeImage():void { if (!_imageBoundary || !_loaded) return; var aspect:Number = width / height; var cAspect:Number = _imageBoundary.width / _imageBoundary.height; if (aspect <= cAspect) { this.height = _imageBoundary.height; this.width = aspect * this.height; } else { this.width = _imageBoundary.width; this.height = this.width / aspect; } this.x = (_imageBoundary.width-this.width)/2 + _imageBoundary.x; this.y = (_imageBoundary.height-this.height)/2 + _imageBoundary.y; } } }
您可以像这样使用它:
var _imageLoader:ImageLoader = new ImageLoader();
_imageLoader.imageURL = "http://some-image-url";
_imageLoader.boundary = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight); // or whatever suits you
ImageLoader扩展Loader类,以便您可以通过Loader类监听所有事件调度。希望它有所帮助。

答案 1 :(得分:1)

尝试实例化新的Loader,可能尝试回收它会给你带来问题

答案 2 :(得分:1)

我会在函数内部声明_ldr,所以每次启动此函数时它都会死掉。我也不会使用这种unload()close()方法。如果制作这样的东西会更简单(你需要一个名为“ldrHelper”的空影片剪辑):

public function loadImage(url:String, _w:int, _h:int):void 
{
    // do your job and die bravely, no need to be global 
    var _ldr:Loader = new Loader();
    this._stwidth = _w;
    this._stheight = _h;
    this._imageURL = url;

    if(!_imageURL)
    {
        return;
    }

    this.alpha = 1.0;   //need this because we might have just faded the image out

    // now you will need to make alpha = 1 on ldrHolder since _ldr is dead after this function
    ldrHolder.alpha = 0.0;
    _prog.alpha = 1.0;
    _sqr.alpha = 0.0;
    _sqr.graphics.clear();


   // remove the old image, doesn't matter whether its empty or not
   while(ldrHolder.numChildren > 0){
         ldrHolder.removeChildAt(0);
   }

    //add image
    ldrHolder.addChild(_ldr);

    _ldr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
    _ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
    _ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
    _ldr.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
    _ldr.contentLoaderInfo.addEventListener(Event.INIT, onOpen);
    _ldr.load(new URLRequest(_imageURL));
}