2013-05-03 38 views
0

我正在用for循環創建多個加載器來加載圖像。然後我將這些圖像放入新的MoveClip中。as3 removeChild和Loaders in them?

需要時我要去removeChild(flagHolder);其中包含裝載器中加載的標誌的所有圖像。 我想知道這會刪除所有加載到我正在刪除的父級影片剪輯的myLoaders?

我希望它可能不會如何佔用資源,因爲這是一個電話應用程序。

我不願意在下面發表我的代碼,因爲不需要問這個問題,但我會反正。這有點亂。我希望在as3中變得更高效。我真的需要所有的資源不被用完,所以我希望我的劇本在這方面不會太糟糕。

import flash.display.MovieClip; 

var daCol:int; 
var daRow:int; 
var daPosition:int; 
var daPage:int; 
var daWidth:int; 
var daHeight:int; 
var daTotalFlags:int; 
var daTotalPages:int; 


var daFlag:Array = []; 
var daFlagText:Array = []; 
var pages:Array = []; 

// Movie Clips 
var newBox:MovieClip = new MovieClip; 


// Make new Movie clip to hold the flags 
var flagHolder = new MovieClip(); 
flagHolder.name = "flagHolder"; 


for (var a:uint = 0; a < DirArray.length; a++) 
{ 
    //trace(DirArray[a]); 


    var Flag = new languageFlag(); 
    Flag.name = DirArray[a]; 
    daFlag.push(Flag); 
    /// Important for adding flag to display 
    //flagHolder.addChild(Flag); 
    Flag.width = 160; 
    //Flag.scaleX = 1.5; 
    //Flag.scaleY = 1.5; 
    daHeight = Flag.height; 
    daWidth = Flag.width; 

    daCol = Math.floor(stage.stageWidth/Flag.width); 
    daRow = Math.floor(stage.stageHeight/Flag.height)-1; 



    trace("Flag Width: " + Flag.width); 
    //Flag.x = Flag.width * a; 
    theFlag = new Loader(); 
    theFlag.load(new URLRequest("Languages/"+DirArray[a]+"/Flag.png")); 
    theFlag.name = DirArray[a]; 
    Flag.addChild(theFlag); 
    //daFlagText = 
    Flag.btext.text = DirArray[a]; 
    theFlag.addEventListener(MouseEvent.CLICK, flagClick); 


} 

BG.addEventListener(MouseEvent.CLICK, fl_MouseClickHandler_2); 

function fl_MouseClickHandler_2(event:MouseEvent):void 
    { 
    /// CALLS FUNCTIONS FOR FLAGS 
    displayFlags(); 
    displayFlagButtons(); 
    } 



function displayFlags() 
    { 
    flagMoveIn(); 
    var theRow = 0; 
    var C = 0; 
    var goUp:int; 
    var spaceHeight:int = 33; 
    daHeight = daHeight + 20; 


    /// DISPLAYS FLAG HOLDER 
    addChild(flagHolder); 

    /// Sets position of Flags in pages to start at zero 
    daPosition = 33; 

    daTotalFlags = daRow * daCol; 
    daTotalPages = daFlag.length/daTotalFlags; 
    trace("DA TOTAL PAGES: " + daTotalPages); 
    ////////////////////// 
    ///////////////////// 
    for(var p = 0; daTotalPages >= p; p++) 
    { 

     var screenPage:MovieClip = new MovieClip(); 
     pages.push(screenPage) 

      for (var F:uint = 0; F <= daRow-1; F++) 
       { 


        if(daFlag[F]) 
        { 

         for(C = theRow; C < theRow+daCol; C++) 
         { 




          if(daFlag[goUp]) 
          { 

          screenPage.addChild(daFlag[goUp]); 
          daFlag[goUp].y = daHeight * F; 
          daFlag[goUp].x = daFlag[goUp].width * C; 

          } 
          goUp++; 

         } 

        } 

       } 
    daPosition = daPosition + stage.stageWidth; 
    //--- End of work For Loop 
    flagHolder.addChild(screenPage); 
    } // End of Pages loop 


    spaceFlags(); 
    }// End of Display Flags 



/// This function orders the pages correctly and spaces them right 
/// and adds buttons to the pages at bottom 
function spaceFlags(){ 


    for(var i = 0; pages.length > i; i++) 
    { 
    pages[i].scaleX = .9; 
    pages[i].scaleY = .9; 

    } 


    newBox.addChild(pages[0]); 

    for(var a = 0; pages.length > a; a++) 
    { 
    pages[a].x = stage.stageWidth/2 - newBox.width/2 + stage.stageWidth * a; 

    } 


    flagHolder.addChild(newBox); 
} 


    var flagButton:MovieClip; 
    var flagArray:Array = new Array; 
    var flagDisplayButtons:MovieClip = new MovieClip(); 
    function displayFlagButtons() 
{ 




    for(var i = 0; pages.length > i; i++) 
    { 
     var flagButton:MovieClip = new roundButton(); 
     flagButton.x = (flagButton.width + 10) * i; 
     flagButton.y = stage.stageHeight - flagButton.height; 
     addChild(flagButton); 
     flagButton.alpha = .3; 

     flagDisplayButtons.addChild(flagButton); 
     flagArray.push(flagDisplayButtons.getChildAt(i) as roundButton); 
    } 
    addChild(flagDisplayButtons); 

    // Works 
    flagDisplayButtons.x = stage.stageWidth/2 - flagDisplayButtons.width/2; 




} 

回答

1
while (movieclip.numChildren > 0) { 
    if (movieclip.getChildAt(0) is Loader) { 
     // if you get an error for null objects here, add in a similar conditional for "is Bitmap" 
     ((movieclip.getChildAt(0) as Loader).content as Bitmap).bitmapData.dispose(); 
    } 
    movieclip.removeChildAt(0); 
} 

這個循環會經過並刪除影片剪輯的每個孩子(顯然改變以匹配你的代碼名稱),並在任何Loader運行dispose()BitmapData.dispose()將允許垃圾回收在下次運行時收集數據(無法強制執行此操作,並且由於系統處理內存的方式而看到更改很困難)。

您可以根據需要明顯修改循環,但是應該爲您提供從內存中卸載每個Loader所需執行的操作的一般要點。

+0

這工作。我現在確實有一個問題。當我加載它後,它不顯示。我相信它是一個VAR範圍。這不是重新創建裝載機或其他東西。 – 2013-05-03 18:34:16

+0

這完全破壞了所有的'BitmapData'。如果您稍後嘗試重新添加這些圖像,則還必須重新加載圖像,因爲它們不再存在於內存中。 – 2013-05-03 18:50:10