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.