Come visto in precedenza, l'elenco di visualizzazione è una struttura ad albero. Nella parte superiore di tale struttura si trova lo stage, che può contenere vari oggetti di visualizzazione. Tali oggetti sono essi stessi contenitori di oggetti di visualizzazione e possono contenere altri oggetti di visualizzazione o contenitori di oggetti di visualizzazione.
La classe DisplayObjectContainer include proprietà e metodi per la lettura dell'elenco di visualizzazione mediante gli elenchi secondari dei contenitori degli oggetti di visualizzazione. Considerate, ad esempio, il codice seguente, che consente di aggiungere due oggetti di visualizzazione,
title
e
pict
, all'oggetto
container
(che corrisponde a una classe Sprite che estende 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);
Il metodo
getChildAt()
restituisce l'elemento secondario dell'elenco di visualizzazione in una posizione di indice specifica:
trace(container.getChildAt(0) is TextField); // true
È possibile accedere agli oggetti secondari anche in base al nome. Ogni oggetto di visualizzazione dispone di un nome proprietà; se non si assegna tale nome, Flash Player assegna un valore predefinito, quale
"instance1"
. Il codice seguente mostra, ad esempio, come utilizzare il metodo
getChildByName()
per accedere a un oggetto di visualizzazione secondaria denominato
"banana loader"
:
trace(container.getChildByName("banana loader") is Loader); // true
L'uso del metodo
getChildByName()
può rallentare le prestazioni rispetto al metodo
getChildAt()
.
Poiché un contenitore di oggetti di visualizzazione può contenere altri contenitori di oggetti di visualizzazione come oggetti secondari nel proprio elenco di visualizzazione, è possibile leggere l'intero elenco di visualizzazione dell'applicazione come se fosse una struttura ad albero. Nell'estratto di codice di cui sopra, ad esempio, una volta completata l'operazione di caricamento dell'oggetto Loader
pict
, l'oggetto
pict
dispone di un oggetto di visualizzazione secondario (la bitmap) caricato. Per accedere all'oggetto di visualizzazione bitmap, scrivere
pict.getChildAt(0)
. È possibile accedervi anche scrivendo
container.getChildAt(0).getChildAt(0)
(poiché
container.getChildAt(0) == pict
).
La funzione seguente fornisce un output
trace()
rientrato dell'elenco di visualizzazione da un contenitore di oggetti di visualizzazione:
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
Chi utilizza Flex, sa già che Flex definisce molte classi di oggetti di visualizzazione di componenti e che tali classi sostituiscono i metodi di accesso all'elenco di visualizzazione della classe DisplayObjectContainer. La classe Container del pacchetto mx.core, ad esempio, sostituisce il metodo
addChild()
e altri metodi della classe DisplayObjectContainer (che viene estesa dalla classe Container). Nel caso del metodo
addChild()
, la classe sostituisce il metodo in modo tale da impedire di aggiungere tutti i tipi di oggetti di visualizzazione a un'istanza Container in Flex. Il metodo sostituito, in questo caso, richiede che l'oggetto secondario che si desidera aggiungere sia un tipo di oggetto mx.core.UIComponent.