Recorrido de la lista de visualización

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

Tal como se ha visto, la lista de visualización tiene una estructura de árbol. En la parte superior del árbol está el objeto Stage, que puede contener varios objetos de visualización. Estos objetos de visualización, que son al mismo tiempo contenedores de objetos de visualización, pueden contener otros objetos de visualización o contenedores de objetos de visualización.

La clase DisplayObjectContainer incluye propiedades y métodos para recorrer la lista de visualización, mediante las listas de elementos secundarios de los contenedores de objetos de visualización. Por ejemplo, el código siguiente añade dos objetos de visualización, title y pict, al objeto container (que es un objeto Sprite y la clase Sprite amplía la clase 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);

El método getChildAt() devuelve el elemento secundario de la lista de visualización en una posición de índice específica:

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

También se puede acceder a los objetos secundarios por el nombre. Todos los objetos de visualización tienen una propiedad de nombre y, si no se asigna, Flash Player o AIR asignan un valor predeterminado como, por ejemplo, "instance1". Por ejemplo, el código siguiente muestra cómo utilizar el método getChildByName() para acceder a un objeto de visualización secundario con el nombre "banana loader":

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

Si se utiliza el método getChildByName() el resultado es más lento que si se usa el método getChildAt().

Como un contenedor de objeto de visualización puede contener otros contenedores de objetos de visualización como objetos secundarios en su lista de visualización, se puede recorrer toda la lista de visualización de la aplicación como un árbol. Por ejemplo, en el fragmento de código anterior, cuando finaliza la operación de carga del objeto Loader pict, el objeto pict tendrá cargado un objeto de visualización secundario, que es el mapa de bits. Para acceder a este objeto de visualización de mapa de bits, se puede escribir pict.getChildAt(0). También se puede escribir container.getChildAt(0).getChildAt(0) (porque container.getChildAt(0) == pict).

La función siguiente proporciona una salida trace() con sangría de la lista de visualización desde un contenedor de objeto de visualización:

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 utiliza Flex, debe saber que define varias clases del objeto de visualización de componente y estas clases sustituyen los métodos de acceso de la lista de visualización de la clase DisplayObjectContainer. Por ejemplo, la clase Container del paquete mx.core sustituye al método addChild() y a otros métodos de la clase DisplayObjectContainer (que amplía la clase Container). En el caso del método addChild(), la clase sustituye el método de tal modo que no es posible agregar todos los tipos de objetos de visualización a una instancia de Container en Flex. En este caso, el método sustituido requiere que el objeto secundario que se va a agregar sea un tipo de objeto mx.core.UIComponent.