Gå igenom visningslistan

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Som du har sett är visningslistan en trädstruktur. Överst i trädet är scenen, som kan innehålla flera visningsobjekt. Dessa visningsobjekt som i sig själva är behållare för visningsobjekt kan innehålla andra visningsobjekt eller behållare för visningsobjekt.

Klassen DisplayObjectContainer innehåller egenskaper och metoder för genomgång av visningslistan med hjälp av visningsobjektbehållarnas listor med underordnade objekt. Titta på följande kod där två visningsobjekt läggs till, title och pict , till objektet container (som är Sprite och klassen Sprite omfattar klassen DisplayObjectContainer):

var container:Sprite = new Sprite(); 
var title:TextField = new TextField(); 
title.text = "Hello"; 
var pict:Loader = new Loader(); 
var url:URLRequest = new URLRequest("banana.jpg"); 
pict.load(url); 
pict.name = "banana loader"; 
container.addChild(title); 
container.addChild(pict);

Metoden getChildAt() returnerar underordnat objekt i visningslistan vid en specifik indexposition:

trace(container.getChildAt(0) is TextField); // true

Du kan även få åtkomst till underordnade objekt per namn. Alla visningsobjekt har en namnegenskap och om du inte tilldelar något namn tilldelas ett standardvärde i Flash Player eller AIR, till exempel "instance1" . Följande kod visar hur du använder metoden getChildByName() för att använda ett underordnat visningsobjekt med namnet "banana loader" :

trace(container.getChildByName("banana loader") is Loader); // true

Användning av metoden getChildByName() kan innebära långsammare bearbetning än metoden getChildAt() .

Eftersom en behållare för visningsobjekt kan innehålla andra behållare som är underordnade objekt i visningslistan kan du gå igenom programmets hela visningslista i ett träd. I kodexemplet som visades tidigare ser du att när inläsningen för Loader-objektet pict är slutförd kommer pict objektet att innehålla ett underordnat visningsobjekt (bitmappen). När du ska använda denna bitmapp kan du skriva pict.getChildAt(0) . Du kan även skriva container.getChildAt(0).getChildAt(0) (eftersom container.getChildAt(0) == pict ).

Följande funktion ger indragen trace() -utdata i visningslistan från en behållare för visningsobjekt:

function traceDisplayList(container:DisplayObjectContainer,                                                indentString:String = ""):void 
{ 
    var child:DisplayObject; 
    for (var i:uint=0; i < container.numChildren; i++) 
    { 
        child = container.getChildAt(i); 
        trace(indentString, child, child.name);  
        if (container.getChildAt(i) is DisplayObjectContainer) 
        { 
            traceDisplayList(DisplayObjectContainer(child), indentString + "    ") 
        } 
    } 
}

Adobe Flex

Om du använder Flex bör du känna till att Flex definierar många visningsobjektklasser, och dessa klasser åsidosätter åtkomstmetoderna till visningslistan för klassen DisplayObjectContainer. Klassen Container för mx.core-paketet åsidosätter till exempel metoden addChild() och andra metoder för klassen DisplayObjectContainer (som klassen Container utökar). När det gäller metoden addChild() åsidosätter klassen metoden på så sätt att du inte kan lägga till alla typer av visningsobjekt i en Container-instans i Flex. Åsidosättningsmetoden kräver i detta fall att det underordnade objektet som du lägger till är av typen mx.core.UIComponent.