Exemplo de objeto de exibição: SpriteArranger

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

O aplicativo de amostra SpriteArranger é criado com base no aplicativo de exemplo Geometric Shapes descrito separadamente no Aprendizado do ActionScript 3.0 .

O aplicativo de amostra SpriteArranger ilustra diversos conceitos de manipulação de objetos de exibição:

  • Extensão de classes de objeto de exibição

  • Adição de objetos à lista de exibição

  • Disposição em camadas de objetos de exibição e trabalho com contêineres de objeto de exibição

  • Resposta a eventos de objeto de exibição

  • Uso de propriedades e métodos de objetos de exibição

Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br . Os arquivos do aplicativo SpriteArranger estão localizados na pasta Exemplos/SpriteArranger. O aplicativo consiste nos seguintes arquivos:

Arquivo

Descrição

SpriteArranger.mxml

ou

SpriteArranger.fla

O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

com/example/programmingas3/SpriteArranger/CircleSprite.as

Uma classe que define um tipo de objeto Sprite que processa um círculo na tela.

com/example/programmingas3/SpriteArranger/DrawingCanvas.as

Uma classe que define a tela de desenho, que é um contêiner de objeto de exibição que contém objetos GeometricSprite.

com/example/programmingas3/SpriteArranger/SquareSprite.as

Uma classe que define um tipo de objeto Sprite que processa um quadrado na tela.

com/example/programmingas3/SpriteArranger/TriangleSprite.as

Uma classe que define um tipo de objeto Sprite que processa um triângulo na tela.

com/example/programmingas3/SpriteArranger/GeometricSprite.as

Uma classe que estende o objeto Sprite, usado para definir uma forma na tela. CircleSprite, SquareSprite e TriangleSprite estendem essa classe.

com/example/programmingas3/geometricshapes/IGeometricShape.as

A interface básica que define os métodos a serem implementados por todas as classes de forma geométrica.

com/example/programmingas3/geometricshapes/IPolygon.as

Uma interface que define os métodos a serem implementados pelas classes de forma geométrica que têm vários lados.

com/example/programmingas3/geometricshapes/RegularPolygon.as

Um tipo de forma geométrica que tem lados com o mesmo comprimento posicionados simetricamente ao redor do centro da forma.

com/example/programmingas3/geometricshapes/Circle.as

Um tipo de forma geométrica que define um círculo.

com/example/programmingas3/geometricshapes/EquilateralTriangle.as

Uma subclasse de RegularPolygon que define um triângulo com todos os lados com o mesmo comprimento.

com/example/programmingas3/geometricshapes/Square.as

Uma subclasse de RegularPolygon que define um retângulo com os quatro lados com o mesmo comprimento.

com/example/programmingas3/geometricshapes/GeometricShapeFactory.as

Uma classe que contém um “método de fábrica” para criar formas com tamanho e tipo especificados.

Definição das classes SpriteArranger

O aplicativo SpriteArranger permite que o usuário adicione vários objetos de exibição à “tela de desenho” exibida.

A classe DrawingCanvas define uma área de desenho, um tipo de contêiner de objeto de exibição ao qual o usuário pode adicionar formas na tela. Essas formas na tela são ocorrências de uma das subclasses de GeometricSprite.

A classe DrawingCanvas

No Flex, todos os objetos de exibição filho adicionados a um objeto Container devem ser de uma classe originada da classe mx.core.UIComponent. Esse aplicativo adiciona uma ocorrência da classe DrawingCanvas como um filho de um objeto mx.containers.VBox, conforme definido no código MXML no arquivo SpriteArranger.mxml. Essa herança é definida na declaração da classe DrawingCanvas, do seguinte modo:

public class DrawingCanvas extends UIComponent

A classe UIComponent é herdada das classes DisplayObject, DisplayObjectContainer e Sprite e o código na classe DrawingCanvas usa métodos e propriedades dessas classes.

A classe DrawingCanvas estende a classe Sprite e sua herança é definida na declaração da classe DrawingCanvas, do seguinte modo:

public class DrawingCanvas extends Sprite

A classe Sprite é uma subclasse de DisplayObjectContainer e de DisplayObject, e a classe DrawingCanvas usa métodos e propriedades dessas classes.

O método do construtor DrawingCanvas() configura um objeto de Rectangle, bounds , que é a propriedade usada posteriormente no desenho do contorno da tela de desenho. Em seguida, o método initCanvas() é chamado do seguinte modo:

this.bounds = new Rectangle(0, 0, w, h); 
initCanvas(fillColor, lineColor);

Como mostra o exemplo a seguir, o método initCanvas() define várias propriedades do objeto DrawingCanvas, que foram transmitidas como argumentos para a função do construtor:

this.lineColor = lineColor; 
this.fillColor = fillColor; 
this.width = 500; 
this.height = 200;

O método initCanvas() chama o método drawBounds() , que desenha a tela de desenho usando a propriedade graphics da classe DrawingCanvas. A propriedade graphics é herdada da classe Shape.

this.graphics.clear();         
this.graphics.lineStyle(1.0, this.lineColor, 1.0); 
this.graphics.beginFill(this.fillColor, 1.0); 
this.graphics.drawRect(bounds.left - 1,  
                        bounds.top - 1,  
                        bounds.width + 2, 
                        bounds.height + 2); 
this.graphics.endFill();

Os métodos adicionais a seguir da classe DrawingCanvas são invocados com base nas interações do usuário com o aplicativo:

A classe GeometricSprite e suas subclasses

Cada objeto de exibição que pode ser adicionado à tela de desenho pelo usuário é uma ocorrência de uma das seguintes subclasses de GeometricSprite:

  • CircleSprite

  • SquareSprite

  • TriangleSprite

A classe GeometricSprite estende a classe flash.display.Sprite:

public class GeometricSprite extends Sprite

A classe GeometricSprite inclui diversas propriedades comuns a todos os objetos GeometricSprite. Essas propriedades são definidas na função do construtor com base nos parâmetros transmitidos para a função. Por exemplo:

this.size = size; 
this.lineColor = lColor; 
this.fillColor = fColor;

A propriedade geometricShape da classe GeometricSprite define uma interface IGeometricShape, que define as propriedades matemáticas, mas não as visuais, da forma. As classes que implementam a interface IGeometricShape são definidas no aplicativo de amostra GeometricShapes descrito no Aprendizado do ActionScript 3.0 .

A classe GeometricSprite define o método drawShape() , que é refinado ainda mais nas definições de substituição em cada subclasse de GeometricSprite. Para obter mais informações, consulte a seção "Adição de objetos de exibição à tela de desenho", apresentada a seguir.

A classe GeometricSprite também fornece os seguintes métodos:

Adição de objetos de exibição à tela de desenho

Quando o usuário clica no botão Adicionar forma, o aplicativo chama o método addShape() da classe DrawingCanvas. Esse método percorre um novo GeometricSprite chamando a função do construtor adequada de uma das subclasses de GeometricSprite, como mostra o exemplo a seguir:

public function addShape(shapeName:String, len:Number):void 
{ 
    var newShape:GeometricSprite; 
    switch (shapeName) 
    { 
        case "Triangle": 
            newShape = new TriangleSprite(len); 
            break; 
 
        case "Square": 
            newShape = new SquareSprite(len); 
            break; 
 
        case "Circle": 
            newShape = new CircleSprite(len); 
            break; 
    } 
    newShape.alpha = 0.8; 
    this.addChild(newShape); 
}

Cada método do construtor chama o método drawShape() , que usa a propriedade graphics da classe (herdada da classe Sprite) para desenhar o gráfico vetorial adequado. Por exemplo, o método drawShape() da classe CircleSprite inclui o seguinte código:

this.graphics.clear(); 
this.graphics.lineStyle(1.0, this.lineColor, 1.0); 
this.graphics.beginFill(this.fillColor, 1.0); 
var radius:Number = this.size / 2; 
this.graphics.drawCircle(radius, radius, radius);

Da segunda à última linha da função addShape() , é definida a propriedade alpha do objeto de exibição (herdada da classe DisplayObject) para que cada objeto de exibição adicionado à tela de desenho seja ligeiramente transparente, deixando o usuário ver os objetos que estão por trás.

A linha final do método addChild() adiciona o novo objeto de exibição à lista de filhos da ocorrência da classe DrawingCanvas, que já está na lista de exibição. Desse modo, o novo objeto de exibição aparece no palco.

A interface do aplicativo inclui dois campos de texto, selectedSpriteTxt e outputTxt . As propriedades de texto desses campos são atualizados com informações sobre os objetos GeometricSprite que foram adicionados à tela de desenho ou selecionados pelo usuário. A classe GeometricSprite manipula essa tarefa de registro de informações substituindo o método toString() da seguinte maneira:

public override function toString():String 
{ 
    return this.shapeType + " of size " + this.size + " at " + this.x + ", " + this.y; 
}

A propriedade shapeType é definida como o valor adequado no método do construtor de cada subclasse de GeometricSprite. Por exemplo, o método toString() poderia retornar o seguinte valor para uma ocorrência de CircleSprite adicionada recentemente à ocorrência de DrawingCanvas:

Circle of size 50 at 0, 0

O método describeChildren() da classe DrawingCanvas percorre a lista de filhos da tela de desenho, usando a propriedade numChildren (herdada da classe DisplayObjectContainer), para definir o limite do loop for . É gerada uma string que lista cada filho, do seguinte modo:

var desc:String = ""; 
var child:DisplayObject; 
for (var i:int=0; i < this.numChildren; i++) 
{ 
child = this.getChildAt(i); 
desc += i + ": " + child + '\n'; 
}

A string resultante é usada para definir a propriedade text do campo de texto outputTxt .

Clique e arrasto de objetos de exibição

Quando o usuário clica em uma ocorrência de GeometricSprite, o aplicativo chama o manipulador de eventos onMouseDown() . Conforme mostrado a seguir, esse manipulador de eventos é definido para ouvir eventos de mouse na função do construtor da classe GeometricSprite:

this.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);

O método onMouseDown() chama o método showSelected() do objeto GeometricSprite. Se for a primeira vez que esse método foi chamado para o objeto, o método criará um novo objeto Shape chamado selectionIndicator e usará a propriedade graphics do objeto Shape para desenhar um retângulo de realce vermelho, do seguinte modo:

this.selectionIndicator = new Shape(); 
this.selectionIndicator.graphics.lineStyle(1.0, 0xFF0000, 1.0); 
this.selectionIndicator.graphics.drawRect(-1, -1, this.size + 1, this.size + 1); 
this.addChild(this.selectionIndicator);

Se não for a primeira vez que o método onMouseDown() é chamado, o método simplesmente definirá a propriedade visible da forma selectionIndicator (herdada da classe DisplayObject), do seguinte modo:

this.selectionIndicator.visible = true;

O método hideSelected() oculta a forma selectionIndicator do objeto selecionado anteriormente definindo a propriedade visible como false .

O manipulador de eventos onMouseDown() também chama o método startDrag() (herdado da classe Sprite), que inclui o seguinte código:

var boundsRect:Rectangle = this.parent.getRect(this.parent); 
boundsRect.width -= this.size; 
boundsRect.height -= this.size; 
this.startDrag(false, boundsRect);

Isso permite que o usuário arraste o objeto selecionado em torno da tela de desenho, dentro dos limites definidos pelo retângulo boundsRect .

Quando o usuário solta o botão do mouse, o evento mouseUp é enviado. O método do construtor de DrawingCanvas configura o seguinte ouvinte de eventos:

this.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);

Esse ouvinte de eventos é definido para o objeto DrawingCanvas, não para objetos GeometricSprite individuais. Isso ocorre porque quando o objeto GeometricSprite é arrastado, pode terminar atrás de outro objeto de exibição (outro objeto GeometricSprite) assim que o mouse é solto. O objeto de exibição em primeiro plano receberia o evento de mouse, mas o objeto de exibição que está sendo arrastado pelo usuário não. A adição do ouvinte ao objeto DrawingCanvas garante que o evento seja sempre manipulado.

O método onMouseUp() chama o método onMouseUp() do objeto GeometricSprite, que, por sua vez, chama o método stopDrag() do objeto GeometricSprite.

Reorganização da disposição em camadas do objeto de exibição

A interface de usuário do aplicativo inclui os botões Mover para trás, Mover para baixo, Mover para cima e Mover para frente. Quando o usuário clica em um desses botões, o aplicativo chama o método correspondente da classe DrawingCanvas: moveToBack() , moveDown() , moveUp() ou moveToFront() . Por exemplo, o método moveToBack() inclui o seguinte código:

public function moveToBack(shape:GeometricSprite):void 
{ 
    var index:int = this.getChildIndex(shape); 
    if (index > 0) 
    { 
        this.setChildIndex(shape, 0); 
    } 
}

O método setChildIndex() (herdado da classe DisplayObjectContainer) é usado para colocar o objeto de exibição na posição de índice 0 na lista de filhos da ocorrência de DrawingCanvas ( this ).

O método moveDown() funciona de modo similar, mas diminui a posição de índice do objeto de exibição em incrementos de 1 na lista de filhos da ocorrência de DrawingCanvas:

public function moveDown(shape:GeometricSprite):void 
{ 
    var index:int = this.getChildIndex(shape); 
    if (index > 0) 
    { 
        this.setChildIndex(shape, index - 1); 
    } 
}

Os métodos moveUp() e moveToFront() funcionam de modo similar aos métodos moveToBack() e moveDown() .