2012-11-15 101 views
0

我有兩個問題需要解決。使用Flash加載圖像並保留寬高比並集中

首先,我有這個功能將圖像(基於url)添加到動畫片段中,並且我嘗試保留影片剪輯中的寬高比。但是我需要集中管理,我無法將裝載程序x和y更改爲合適的值。

function addImg(movieclip,url):void { 
    var urlRequest:URLRequest = new URLRequest(url); 
    var loader:Loader = new Loader(); 
    var loaderContext:LoaderContext = new LoaderContext(); 
    loaderContext.checkPolicyFile = true; 

    loader.load(urlRequest, loaderContext); 

    var W:Number = movieclip.width; 
    var H:Number = movieclip.height; 
    var A:Number = W/H; 

    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event){ 
     var tempImage:Bitmap = new Bitmap(e.target.content.bitmapData); 

     var image:Object = {}; 
     image.width = 267; 
     image.height = 223; 

     var a:Number = image.width/image.height; 

     if(A >= a){ 
      loader.width =H*a; 
      loader.height =H; 
     }else{ 
      loader.width = W; 
      loader.height =W/a; 
     } 

     movieclip.alpha =1;  
     loader.alpha = 1; 

     movieclip.addChild(loader); 
    }); 
} 

二,我使用硬編碼的寬度和高度。我如何識別圖像的原始尺寸?我嘗試偷看新的位圖(e.target.content.bitmapData),但寬度和高度都是錯誤的(顯示舞臺的w和h)。

任何意識?

回答

1

您需要從contentLoaderInfo屬性中提取此數據。

在你的情況:

var originalHeight:int(e.currentTarget as LoaderInfo).height; 
var originalWidth:Number = (e.currentTarget as LoaderInfo).width; 

如文檔中爲LoaderInfo#height討論:

此值可能從在其 顯示的內容的實際高度不同,因爲加載的內容或其父顯示對象 可能會縮放


另外,你不應該在這個問題上聲明函數。內存管理和代碼組織很差。每次加載圖像時,都必須在內存中重新創建該函數,而不是僅引用它。因此,CPU必須在每次需要時才重新創建該函數,並且每個實例都存儲在內存中,直到下一次運行GarbageCollection。如果你在全局空間聲明它(永遠不會在其他函數中嵌套函數),當函數在作用域內時(通常是在類被加載時),該函數會立即加載到內存中。所以在加載時會有一些開銷,但一旦加載,它就在那裏並準備好使用。也將只有該功能的一個實例。

如果你只是做1張圖片,這看起來似乎不是什麼大不了的事情,但是當做一個有幾百個大拇指的畫廊的拇指牆時,它可能會導致內存泄漏。

1

不知道如果我完全理解你的問題,但答案似乎很簡單,如下例:

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

    public class Main extends Sprite 
    { 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      var loader:Loader = new Loader(); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); 
      loader.load(new URLRequest("images/koala.jpg")); 

     }// end function 

     private function onComplete(e:Event):void { 

      var bitmap:Bitmap = ((e.target as LoaderInfo).content as Bitmap); 

      var sprite:Sprite = new Sprite(); 

      sprite.addChild(bitmap); 

      bitmap.x = -(bitmap.width/2); 
      bitmap.y = -(bitmap.height/2); 

      addChild(sprite); 

      sprite.x = stage.stageWidth/2; 
      sprite.y = stage.stageHeight/2; 

     }// end function 

    }// end class 

}// end package 

您加載了Loader對象的圖像,並添加一個Event.COMPLETE事件偵聽器Loader.contentLoaderInfo財產。

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); 
loader.load(new URLRequest("images/koala.jpg")); 

然後,當事件處理程序被調用你從LoaderInfo對象

var bitmap:Bitmap = ((e.target as LoaderInfo).content as Bitmap); 

然後創建你把你的位圖的顯示對象容器中的位圖。然後,將位圖居中放置在顯示對象容器中,將位圖的x屬性設置爲其寬度的一半減去,並將位圖的y屬性設置爲減去其高度的一半。

var sprite:Sprite = new Sprite(); 

sprite.addChild(bitmap); 

bitmap.x = -(bitmap.width/2); 
bitmap.y = -(bitmap.height/2); 
相關問題