Comme nous l’avons vu, la liste d’affichage est une structure en arborescence. Au sommet de l’arborescence figure la scène, qui peut comporter plusieurs objets d’affichage. Les objets d’affichage qui sont eux-mêmes des conteneurs d’objets d’affichage peuvent contenir d’autres objets d’affichage, voire des conteneurs d’objets d’affichage.
La classe DisplayObjectContainer comporte des propriétés et méthodes de parcours de la liste d’affichage, par le biais des listes d’enfants des conteneurs d’objets d’affichage. Considérons par exemple le code suivant, qui ajoute deux objets d’affichage,
title
et
pict
, à l’objet
container
(qui est un Sprite, et la classe Sprite étend la 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);
La méthode
getChildAt()
renvoie l’enfant de la liste d’affichage à une position d’index déterminée :
trace(container.getChildAt(0) is TextField); // true
Vous pouvez également accéder aux objets enfant en indiquant leur nom. Chaque objet d’affichage possède un nom, qui est attribué par défaut par Flash Player ou AIR (tel «
instance1
») si vous ne l’attribuez pas vous-même. Par exemple, le code suivant indique comment utiliser la méthode
getChildByName()
pour accéder à un objet d’affichage enfant portant le nom «
banana loader
» :
trace(container.getChildByName("banana loader") is Loader); // true
L’utilisation de la méthode
getChildByName()
entraîne parfois un ralentissement des performances par rapport à la méthode
getChildAt()
.
Puisque la liste d’affichage d’un conteneur d’objets d’affichage peut contenir d’autres conteneurs d’objets d’affichage en tant qu’objets enfant, vous pouvez parcourir la liste d’affichage complète de l’application sous forme d’arborescence. Par exemple, dans l’extrait de code illustré précédemment, une fois l’opération de chargement de l’objet Loader
pict
terminée, un objet d’affichage enfant (l’image bitmap) de l’objet
pict
est chargé. Pour accéder à cet objet d’affichage bitmap, vous pouvez écrire
pict.getChildAt(0)
. Vous pouvez également écrire
container.getChildAt(0).getChildAt(0)
(puisque
container.getChildAt(0) == pict
).
La fonction suivante génère un extrait
trace()
en retrait de la liste d’affichage d’un conteneur d’objets d’affichage :
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
Si vous utilisez Flex, notez que cette application définit un grand nombre de classes d’objets d’affichage de composant et que celles-ci priment sur les méthodes d’accès à la liste d’affichage de la classe DisplayObjectContainer. Par exemple, la classe Container du package mx.core prime sur la méthode
addChild()
et autres méthodes de la classe DisplayObjectContainer (étendue par la classe Container). Dans le cas de la méthode
addChild()
, la classe primant sur la méthode, vous ne pouvez pas ajouter tous les types d’objets d’affichage à une occurrence de Container dans Flex. La méthode remplacée demande dans ce cas que l’objet enfant ajouté soit de type mx.core.UIComponent.