2009-12-29 90 views
1

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

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)); 
    } 

出于某种原因,没有第2次负载发出错误的代码将不会加载图像。 有人可以帮我解决这个问题吗?

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

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

感谢

回答

1

我将宣布_ldr里面的功能所以它的死每次启动这个功能。我也不会使用这个unload()close()方法。它更简单,如果做这样的事情(你需要有一个空的movieclip叫做“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)); 
} 
+0

我已经想到了这一点,虽然我喜欢你的解决方案,使用removeChild()和addChild()来包装它。最终,我目前正在运行的(并且不会产生任何错误的)答案是简单地重新加载一个新的映像,_不再循环加载器,_not_ try/catch,并且在完成此类之上的其他类时为其分派事件在显示列表链中。 – jml 2010-01-18 10:46:55

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类监听所有的事件派发。希望能帮助到你。

+0

不错。我感谢帮助。 – jml 2009-12-29 07:57:14

+0

@bhups:我在这里创建了一个新主题: http://stackoverflow.com/questions/1997655/how-to-get-a-stage-calculation-to-resize-an-image-wrtc你能帮我吗我可能会错过什么?非常感谢您的帮助。 – jml 2010-01-04 05:32:14

+0

嗨再次bhups,我有一个问题,当loadImage()函数内部检测到错误时。你能告诉我问题是什么吗?我发现(如果我追踪)第一次加载图像时发现错误。如果我放弃错误,它会加载,但如果我返回,图像不会加载。所以对我来说,用这种方式重新加载没什么意义。应该有一个更清晰的定义,比如对_loaded进行检查......但这也不起作用? :s – jml 2010-01-08 03:39:12

1

尝试实例新的Loader,可能是试图回收它是给你的问题

+0

这是常见的做法吗?会引起延迟吗? – jml 2010-01-15 17:47:54

+0

我试图实例化一个新的,这似乎并没有工作。 – jml 2010-01-15 20:27:06