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.