Exemplo de objeto de exibição: SpriteArrangerFlash 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:
Para obter os arquivos do aplicativo para este 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:
Definição das classes SpriteArrangerO 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 DrawingCanvasNo 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 subclassesCada objeto de exibição que pode ser adicionado à tela de desenho pelo usuário é uma ocorrência de uma das seguintes subclasses de GeometricSprite:
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 desenhoQuando 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çãoQuando 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çãoA 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(). |
![]() |