Como percorrer a lista de exibição

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

Como você observou, a lista de exibição é uma estrutura de árvore. Na parte superior da árvore está o palco, que pode conter vários objetos de exibição. Esses objetos que são contêineres propriamente ditos podem ter outros objetos de exibição ou contêineres.

A classe DisplayObjectContainer inclui propriedades e métodos para percorrer a lista de exibição por meio das listas de filhos dos contêineres de objeto de exibição. Por exemplo, considere o código a seguir, que adiciona dois objetos de exibição, title e pict , ao objeto container (que é um Sprite; a classe Sprite estende a classe 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);

O método getChildAt() retorna o filho da lista de exibição em uma posição de índice específica:

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

Você também pode acessar objetos filho por nome. Cada objeto de exibição tem uma propriedade de nome e, se você não designá-la, o Flash Player ou AIR atribuirá um valor padrão, como "instance1" . Por exemplo, o código a seguir mostra como usar o método getChildByName() para acessar um objeto de exibição filho com o nome "banana loader" :

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

O método getChildByName() piora mais o desempenho do que o método getChildAt() .

Como um contêiner de objeto de exibição pode ter outros contêineres como objetos filho em sua lista de exibição, é possível percorrer a lista inteira do aplicativo como uma árvore. Por exemplo, no trecho de código mostrado anteriormente, assim que a operação de carregamento do objeto pict Loader for concluída, o objeto pict terá um objeto de exibição filho, que é o bitmap carregado. Para acessar esse objeto de exibição de bitmap, você pode gravar pict.getChildAt(0) . Você também pode gravar container.getChildAt(0).getChildAt(0) (visto que container.getChildAt(0) == pict ).

A função a seguir fornece uma saída trace() pretendida da lista de exibição a partir de um contêiner:

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

O Flex, caso você o utilize, define muitas classes de objeto de exibição e essas classes substituem os métodos de acesso à lista de exibição da classe DisplayObjectContainer. Por exemplo, a classe Container do pacote mx.core substitui o método addChild() e outros métodos da classe DisplayObjectContainer (estendida pela classe Container). No caso do método addChild() , a classe substitui o método de tal forma que não é possível adicionar todos os tipos de objeto de exibição a uma ocorrência de Container no Flex. O método substituído, nesse caso, exige que o objeto filho que está sendo adicionado seja do tipo mx.core.UIComponent.