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()
.
|
|
|