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.