Beispiel für ein Anzeigeobjekt: SpriteArranger

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Die Beispielanwendung „SpriteArranger“ baut auf der Beispielanwendung „Geometric Shapes“ auf, die im ActionScript 3.0 – Arbeitshandbuch beschrieben wird.

Die Beispielanwendung „SpriteArranger“ verdeutlicht verschiedene Konzepte beim Verwenden von Anzeigeobjekten:

  • Erweitern von Anzeigeobjektklassen

  • Hinzufügen von Objekten zur Anzeigeliste

  • Anordnen von Anzeigeobjekten auf Ebenen und Arbeiten mit Anzeigeobjektcontainern

  • Reagieren auf Anzeigeobjektereignisse

  • Arbeiten mit den Eigenschaften und Methoden von Anzeigeobjekten

Die Anwendungsdateien für dieses Beispiel finden Sie unter www.adobe.com/go/learn_programmingAS3samples_flash_de . Die Dateien der SpriteArranger-Anwendung befinden sich im Ordner „Examples/SpriteArranger“. Die Anwendung umfasst die folgenden Dateien:

Datei

Beschreibung

SpriteArranger.mxml

oder

SpriteArranger.fla

Die Hauptanwendungsdatei im Flash-Format (FLA) oder Flex-Format (MXML).

com/example/programmingas3/SpriteArranger/CircleSprite.as

Eine Klasse, die ein Sprite-Objekt definiert, das einen Kreis auf dem Bildschirm anzeigt.

com/example/programmingas3/SpriteArranger/DrawingCanvas.as

Eine Klasse, die eine Leinwand definiert, die der Anzeigeobjektcontainer ist, in dem die GeometricSprite-Objekte enthalten ist.

com/example/programmingas3/SpriteArranger/SquareSprite.as

Eine Klasse, die ein Sprite-Objekt definiert, das ein Quadrat auf dem Bildschirm anzeigt.

com/example/programmingas3/SpriteArranger/TriangleSprite.as

Eine Klasse, die ein Sprite-Objekt definiert, das ein Dreieck auf dem Bildschirm anzeigt.

com/example/programmingas3/SpriteArranger/GeometricSprite.as

Eine Klasse, die das Sprite-Objekt erweitert und zum Definieren einer Form auf dem Bildschirm verwendet wird. Diese Klasse wird von CircleSprite, SquareSprite und TriangleSprite erweitert.

com/example/programmingas3/geometricshapes/IGeometricShape.as

Die Methoden, mit denen die grundlegenden Schnittstelle definiert wird, die von allen GeometricShapes-Klassen implementiert werden müssen.

com/example/programmingas3/geometricshapes/IPolygon.as

Die Methoden, mit denen eine Schnittstelle definiert wird, die von allen GeometricShapes-Klassen mit mehreren Seiten implementiert werden müssen.

com/example/programmingas3/geometricshapes/RegularPolygon.as

Eine geometrische Form, deren gleich lange Seiten symmetrisch um den Mittelpunkt der Form positioniert sind.

com/example/programmingas3/geometricshapes/Circle.as

Eine geometrische Form, die einen Kreis definiert.

com/example/programmingas3/geometricshapes/EquilateralTriangle.as

Eine Unterklasse von RegularPolygon, die ein Dreieck definiert, dessen Seiten die gleiche Länge aufweisen.

com/example/programmingas3/geometricshapes/Square.as

Eine Unterklasse von RegularPolygon, die ein Rechteck definiert, dessen vier Seiten die gleiche Länge aufweisen.

com/example/programmingas3/geometricshapes/GeometricShapeFactory.as

Eine Klasse, die eine „Factory-Methode“ zum Erstellen von Formen eines bestimmten Typs und einer bestimmten Größe enthält.

Definieren der SpriteArranger-Klassen

Mit der Anwendung „SpriteArranger“ können Benutzer der „Leinwand“ auf dem Bildschirm verschiedene Anzeigeobjekte hinzufügen.

Die DrawingCanvas-Klasse definiert einen Zeichenbereich (einen Anzeigeobjektcontainer), dem der Benutzer auf dem Bildschirm anzuzeigende Formen hinzufügen kann. Diese Bildschirm-Formen sind Instanzen einer der Unterklassen der GeometricSprite-Klasse.

DrawingCanvas-Klasse

In Flex müssen alle untergeordneten Anzeigeobjekte, die einem Container-Objekt hinzugefügt werden, einer Klasse angehören, die ein Nachfolger der mx.core.UIComponent-Klasse ist. Diese Anwendung fügt eine Instanz der DrawingCanvas-Klasse als untergeordnetes Element eines mx.containers.VBox-Objekts hinzu, wie im MXML-Code in der Datei „SpriteArranger.mxml“ definiert. Diese Vererbung ist in der Deklaration DrawingCanvas-Klasse wie folgt definiert:

public class DrawingCanvas extends UIComponent

Die UIComponent-Klasse erbt von der DisplayObject-, der DisplayObjectContainer- und der Sprite-Klasse und der Code in der DrawingCanvas-Klasse verwendet Methoden und Eigenschaften dieser Klassen.

Die DrawingCanvas-Klasse erweitert die Sprite-Klasse. Diese Vererbung ist in der Deklaration der DrawingCanvas-Klasse wie folgt definiert:

public class DrawingCanvas extends Sprite

Die Sprite-Klasse ist eine Unterklasse der DisplayObjectContainer- und der DisplayObject-Klasse. In der DrawingCanvas-Klasse werden Methoden und Eigenschaften dieser Klassen verwendet.

Die DrawingCanvas() -Konstruktormethode richtet ein Rectangle-Objekt namens bounds ein, bei dem es sich um eine Eigenschaft handelt, die später zum Zeichnen der Leinwandkontur verwendet wird. Dann ruft sie die initCanvas() -Methode auf:

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

Wie das folgende Beispiel zeigt, definiert die Methode initCanvas() verschiedene Eigenschaften des DrawingCanvas-Objekts, die als Argumente an die Konstruktorfunktion übergeben werden:

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

Die Methode initCanvas() ruft dann die Methode drawBounds() auf, die mit der Eigenschaft graphics der DrawingCanvas-Klasse die Leinwand zeichnet. Die Eigenschaft graphics wird von der Shape-Klasse geerbt.

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

Die folgenden zusätzlichen Methoden der DrawingCanvas-Klasse werden basierend auf Interaktionen des Benutzers mit der Anwendung aufgerufen:

GeometricSprite-Klasse und ihre Unterklassen

Jedes Anzeigeobjekt, das ein Benutzer der Leinwand hinzufügen kann, ist eine Instanz einer der folgenden Unterklassen der GeometricSprite-Klasse:

  • CircleSprite

  • SquareSprite

  • TriangleSprite

Die GeometricSprite-Klasse erweitert die flash.display.Sprite-Klasse:

public class GeometricSprite extends Sprite

Die GeometricSprite-Klasse definiert verschiedene Eigenschaften, die allen GeometricSprite-Objekten gemein sind. Diese werden in der Konstruktorfunktion basierend auf Parametern eingestellt, die an die Funktion übergeben werden. Zum Beispiel:

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

Die Eigenschaft geometricShape der GeometricSprite-Klasse definiert eine IGeometricShape-Schnittstelle, die wiederum die mathematischen Eigenschaften der Form, aber nicht ihre visuellen Eigenschaften festgelegt. Die Klassen, die die IGeometricShape-Schnittstelle implementieren, werden in der GeometricShapes-Beispielanwendung definiert, die im ActionScript 3.0 – Arbeitshandbuch beschrieben wird.

Die GeometricSprite-Klasse definiert die Methode drawShape() , die darüber hinaus in den Überschreibungsdefinitionen jeder Unterklasse von GeometricSprite weiter definiert wird. Weitere Informationen finden Sie im nachfolgenden Abschnitt „Hinzufügen von Anzeigeobjekten zur Leinwand“.

Darüber hinaus stellt die GeometricSprite-Klasse folgende Methoden zur Verfügung:

Hinzufügen von Anzeigeobjekten zur Leinwand

Klickt ein Benutzer auf die Schaltfläche „Form hinzufügen“, ruft in die Anwendung die Methode addShape() der DrawingCanvas-Klasse auf. Sie instanziiert ein neues GeometricSprite, indem sie die geeignete Konstruktorfunktion einer der GeometricSprite-Unterklassen aufruft. Dies wird im folgenden Beispiel gezeigt:

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); 
}

Jede Konstruktormethode ruft die Methode drawShape() auf, die wiederum die graphics -Eigenschaft der Klasse verwendet (von der Sprite-Klasse geerbt), um die entsprechende Vektorgrafik zu zeichnen. Beispielsweise enthält die drawShape() -Methode der CircleSprite-Klasse den folgenden Code:

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);

Die vorletzte Zeile der addShape() -Funktion stellt die alpha -Eigenschaft des Anzeigeobjekts ein (von der DisplayObject-Klasse geerbt). Jedes der Leinwand hinzugefügte Anzeigeobjekt erscheint etwas transparent und lässt den Benutzer sehen, was sich dahinter befindet.

Die letzte Zeile der addChild() -Methode fügt das neue Anzeigeobjekt zur Child-Liste der Instanz der DrawingCanvas-Klasse hinzu, die sich bereits in der Anzeigeliste befindet. Dadurch wird das neue Anzeigeobjekt auf der Bühne angezeigt.

Die Schnittstelle dieser Anwendung umfasst zwei Textfelder, selectedSpriteTxt und outputTxt . Die Texteigenschaften dieser Textfelder werden mit Informationen zu den GeometricSprite-Objekten aktualisiert, die der Leinwand hinzugefügt oder vom Benutzer ausgewählt wurden. Die GeometricSprite-Klasse verarbeitet diese Aufgabe zum Melden von Informationen durch Überschreiben der toString() -Methode. Dies wird im folgenden Beispiel gezeigt:

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

Die Eigenschaft shapeType wird in der Konstruktormethode jeder GeometricSprite-Unterklasse auf einen geeigneten Wert gesetzt. Beispielsweise könnte die Methode toString() den folgenden Wert für eine CircleSprite-Instanz zurückgeben, die der DrawingCanvas-Instanz vor kurzem hinzugefügt wurde:

Circle of size 50 at 0, 0

Die describeChildren() -Methode der DrawingCanvas-Klasse durchläuft die Child-Liste der Leinwand und verwendet die Eigenschaft numChildren (von der DisplayObjectContainer-Klasse geerbt), um den Grenzwert für die for -Schleife festzulegen. Dies erstellt eine Zeichenfolge, die alle untergeordneten Elemente aufführt:

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

Die resultierende Zeichenfolge dient zum Einstellen der Eigenschaft text des Textfeldes outputTxt .

Klicken und Ziehen von Anzeigeobjekten

Klickt der Benutzer auf eine GeometricSprite-Instanz, ruft die Anwendung die onMouseDown() -Ereignisprozedur auf. Wie der folgende Code zeigt, ist diese Ereignisprozedur in der Konstruktorfunktion der GeometricSprite-Klasse zur Überwachung auf eine gedrückte Maustaste eingestellt:

this.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);

Die onMouseDown() -Methode ruft daraufhin die showSelected() -Methode des GeometricSprite-Objekts auf. Wird diese Methode das erste Mal für ein Objekt aufgerufen, erstellt sie ein neues Shape-Objekt namens selectionIndicator und verwendet die Eigenschaft graphics des Shape-Objekts zum Zeichnen eines roten Markierungsrechtecks. Dies wird im folgenden Beispiel gezeigt:

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);

Wird die Methode onMouseDown() nicht das erste Mal aufgerufen, stellt sie einfach die Eigenschaft visible der Form selectionIndicator (von der DisplayObject-Klasse geerbt) wie folgt ein:

this.selectionIndicator.visible = true;

Die hideSelected() -Methode blendet die selectionIndicator -Form des zuvor ausgewählten Objekts aus, indem sie deren Eigenschaft visible auf false einstellt.

Außerdem ruft die Ereignisprozedurmethode onMouseDown() die startDrag() -Methode auf (von der Sprite-Klasse geerbt), die den folgenden Code enthält:

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

Dadurch kann der Benutzer das ausgewählte Objekt auf der Leinwand verschieben, und zwar innerhalb der Grenzen, die durch das boundsRect -Rechteck festgelegt werden.

Lässt der Benutzer die Maustaste los, wird das mouseUp -Ereignis ausgelöst. Die Konstruktormethode von DrawingCanvas richtet den folgenden Ereignis-Listener ein:

this.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);

Dieser Ereignis-Listener ist für das DrawingCanvas-Objekt und nicht für einzelne GeometricSprite-Objekte eingestellt. Der Grund hierfür ist, dass sich ein gezogenes GeometricSprite-Objekt beim Loslassen der Maustaste hinter einem anderen Anzeigeobjekt (einem anderen GeometricSprite-Objekt) befinden könnte. Dann würde das Anzeigeobjekt im Vordergrund das MouseUp-Ereignis erhalten, das vom Benutzer gezogene Anzeigeobjekt jedoch nicht. Das Hinzufügen dessen Listeners zum DrawingCanvas-Objekt stellt sicher, dass das Ereignis immer verarbeitet wird.

Die onMouseUp() -Methode ruft die onMouseUp() -Methode des GeometricSprite-Objekts auf, die wiederum die stopDrag() -Methode des GeometricSprite-Objekts aufruft.

Neuanordnen der Anzeigeobjektebenen

Die Benutzeroberfläche der Anwendung umfasst Schaltflächen mit den Beschriftungen „Move Back“, „Move Down“, „Move Up“ und „Move to Front“. Wenn der Benutzer auf eine dieser Schaltflächen klickt, ruft die Anwendung die entsprechende Methode der DrawingCanvas-Klasse auf: moveToBack() , moveDown() , moveUp() oder moveToFront() . Beispielsweise enthält die moveToBack() -Methode den folgenden Code:

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

Diese Methode verwendet die setChildIndex() -Methode (von der DisplayObjectContainer-Klasse geerbt), um das Anzeigeobjekt an Indexposition 0 in der Child-Liste der DrawingCanvas-Instanz ( this ) zu positionieren.

Die moveDown() -Methode arbeitet ähnlich, außer dass sie die Indexposition des Anzeigeobjekts in der Child-Liste der DrawingCanvas-Instanz um 1 verringert:

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

Die Methoden moveUp() und moveToFront() arbeiten ähnlich wie die Methoden moveToBack() und moveDown() .