ActionScript/Manipulando a lista de exibição

Origem: Wikilivros, livros abertos por um mundo aberto.

O ActionScript 3.0 oferece boas maneiras de se manipular a ordem dos objetos na lista de exibição.

Utilizando swapChildren e swapChildrenAt[editar | editar código-fonte]

Estes métodos alternam as posições de dois objetos. A diferença entre um é que swapChildren() pede o nome dos dois objetos. Já swapChildrenAt() pede o número da posição deles na lista de exibição.

Utilizando swapChildren():

// Função para desenhar retângulos
function desenhe(posX:int, posY:int, cor:uint):Sprite 
{
    var sp:Sprite = new Sprite();
    var g:Graphics = sp.graphics;
    g.beginFill(cor, 1);
    g.drawRoundRect(posX, posY, 200, 150, 5, 5);
    g.endFill();

    return sp;
}

// Utilizando a função de desenho
var ret1:Sprite = desenhe(50, 50, 0x000099);
var ret2:Sprite = desenhe(100, 100, 0x009900);

addChildAt(ret1, 0);
addChildAt(ret2, 1);

stage.addEventListener(MouseEvent.CLICK, alternar);
function alternar(evt:MouseEvent):void 
{
    swapChildren(ret1, ret2);
}

Agora utilizando swapChildrenAt():

// Função para desenhar retângulos
function desenhe(posX:int, posY:int, cor:uint):Sprite 
{
    var sp:Sprite = new Sprite();
    var g:Graphics = sp.graphics;
    g.beginFill(cor, 1);
    g.drawRoundRect(posX, posY, 200, 150, 5, 5);
    g.endFill();
    return sp;
}

// Utilizando a função de desenho
var ret1:Sprite = desenhe(50, 50, 0x000099);
var ret2:Sprite = desenhe(100, 100, 0x009900);

addChildAt(ret1, 0);
addChildAt(ret2, 1);

stage.addEventListener(MouseEvent.CLICK, alternar);

function alternar(evt:MouseEvent):void 
{
    swapChildrenAt(0, 1);
}

Os exemplos acima usam funções diferentes mas obtém o mesmo resultado. Compile o programa é clique no palco. Você verá os objetos se alternando em profundidade.

Obtendo informações sobre os objetos da lista de exibição[editar | editar código-fonte]

Existe uma maneira de obter informações sobre um objeto na lista de exibição. Basta criar um DisplayObject que contém algum objeto pego por uma função do tipo getChildAt() (para buscar no nível de profundidade) ou getChildByName() (para buscar pelo nome).

// Baseando-se no exemplo anterior, damos um nome para o ret1 (retângulo azul)

ret1.name = "Azulzinho";
ret2.name = "Verdão";

addChildAt(ret1, 0);
addChildAt(ret2, 1);

/* Armazenamos em disObj um objeto do tipo Objeto de exibição, que conterá o valor da busca por
objetos que estejam no nível 0 de profundidade */
var disObj1:DisplayObject = getChildAt(0);

trace(disObj1.name);
// Exibe Azulzinho

// Buscamos agora o objeto pelo nome dele. Usando o método getChildByName()...
var disObj2:DisplayObject = getChildByName("Verdão");

trace(disObj2.name);
// Exibe Verdão

Esta é a maneira de se buscar na lista de exibição. Se simplesmente chamássemos trace(Azulzinho.name), ocorreria um erro (objeto não seria encontrado). Por fim, usamos o método getChildIndex() para encontrar o nível de profundidade onde se encontra um objeto de exibição.

// Baseando-se no anterior, disObj2 está no nível 1 de profundidade...

trace(getChildIndex(disObj2));
// Exibe 1