Parcours de la liste d’affichage

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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.