17.3 Komponenten erstellen
Die Erstellung von eigenen Komponenten ist wirklich keine große Sache, da es nur wenige Schritte zu befolgen gibt. Zwar gestaltet sich das Ganze mit ActionScript 1 noch etwas umständlicher als mit ActionScript 2.0, aber dennoch ist das selbst in diesem Fall eine überschaubare Herausforderung!
Nur sobald die Komponente zu den von Macromedia angebotenen Components V2 passen soll, wird es deutlich anspruchsvoller (siehe »Vorbehalte« auf Seite 439). Aus diesem Grund beschränkt sich dieses Kapitel auf die grundlegenden Schritte, um zu leistungsfähigen Komponenten zu gelangen.
17.3.1 ActionScript 1
Siehe Objekterstellung in Kapitel 13
Um eine Komponente anzulegen, benötigen Sie eine ActionScript-Klasse und ein Movieclip-Symbol. Auch wenn es nicht unbedingt notwendig ist, hat es sich eingebürgert, die Klasse innerhalb des Symbols im ersten Schlüsselbild zu platzieren:
function Frau() {
erstellen mit ActionScript 1
}
Damit die Klasse alle notwendigen Fähigkeiten und Eigenschaften von der Klasse MovieClip übernimmt, kommt die Vererbung zum Einsatz:
Frau.prototype = new MovieClip();
Anschließend legen Sie die Eigenschaften und Methoden fest, wobei einer Komponente durch die Vererbung automatisch alle Eigenschaften und Methoden von MovieClips zur Verfügung stehen:
function Frau() {
this.elan = 100;
}
Frau.prototype = new MovieClip();
Frau.prototype.onEnterFrame = function() {
// Bewege auf und ab
this._y = Math.sin(getTimer()/500)*this.elan+200;
};
Der wichtigste Schritt, um ein Symbol und eine Klasse zu einer Komponente zu verschmelzen, ist die statische Methode registerClass in der Klasse Object. Diese verbindet das Symbol mit der Klasse. Das funktioniert aber nur, wenn das Symbol einen Verknüpfungsnamen trägt (engl. Linkage), den Sie in der Bibliothek festlegen:
// Symbol
var linkage:String = "frau";
// Klasse
var classObj = Frau;
// Verschmelze Symbol und Klasse zu einer Komponente
Object.registerClass(linkage, classObj);
Grundsätzlich sind Sie fertig, wäre da nicht ein »Reihenfolgeproblem« bei der Erstellung. Denn momentan müssen Sie eine Instanz erzeugen, damit die registerClass-Methode ausgeführt wird. Doch dadurch geschieht die Verschmelzung von Symbol und Klasse erst nachträglich! Um nun das Erzeugen der Komponente vorher zu erzwingen, nutzen Sie einen initClip-Block, der einmalig ganz am Anfang ausgeführt wird (siehe »Movieclips«, Seite 362). Das komplette Skript sieht dann so aus:
#initclip
function Frau() {
this.elan = 100;
}
Frau.prototype = new MovieClip();
Frau.prototype.onEnterFrame = function() {
// Bewege auf und ab
this._y = Math.sin(getTimer()/500)*this.elan+200;
};
// Symbol
var linkage:String = "frau";
// Klasse
var classObj = Frau;
// Verschmelze Symbol und Klasse zu einer Komponente
Object.registerClass(linkage, classObj);
#endinitclip
17.3.2 ActionScript 2.0
erstellen mit ActionScript 2.0
Die Erstellung einer Komponente mit ActionScript 2.0 unterscheidet sich nur wenig von der Variante mit ActionScript 1. In erster Linie profitieren Sie als Entwickler davon, dass die notwendige Klasse als externe Datei vorliegt und sich leicht mit einem Symbol verbinden lässt.
Klasse erstellen!
Im ersten Schritt benötigen Sie eine Klasse, die von MovieClip erbt und mit der gewünschten Funktionalität versorgt wird:
class Frau extends MovieClip {
var elan:Number = 100;
function Frau() {
}
function onEnterFrame() {
// Bewege auf und ab
_y = Math.sin(getTimer()/500)*elan+200;
}
}
Klasse mit Symbol verbinden!
Im zweiten Schritt verbinden Sie diese Klasse mit dem gewünschten Symbol, indem Sie in der Bibliothek die Verknüpfungseigenschaften für das Symbol wählen und dort die Klasse angeben.
17.3.3 Parameter festlegen
Sofern Komponenten visuell per Maus zusammengeklickt werden, dann bieten sich Komponentenparameter an. Denn bei einer programmierten Erzeugung von Komponenten benötigen Sie ohnehin keine Parameter, die im Eigenschaften- oder Komponenteninspektor sichtbar sind.
Diese Parameter erstellen Sie in der Bibliothek über Optionsmenü • Komponentendefinition für jedes einzelne Symbol. Die hier angelegten Parameter werden im Eigenschafteninspektor für jede Instanz einzeln angepasst. Zur Laufzeit stehen die Parameter in der Instanz mit den eingestellten Werten zur Verfügung.
Metadaten
Innerhalb von ActionScript 2.0-Dateien können außerdem noch Metadaten verwendet werden, um das Anlegen von Komponentenparametern zu erleichtern (siehe Tabelle). Im Zusammenspiel mit Macromedias Komponenten ermöglichen Metadaten ebenfalls die Bindung von Parametern und das Anlegen selbst definierter Ereignisse (http://livedocs.macromedia.com/flash/mx2004/main/05_cre31.htm).
Vermeiden Sie Metadaten, wenn Sie auf das von Macromedia mitgelieferte Framework für Komponenten verzichten wollen!
Tabelle 17.8
Metadaten-Tags
Tag
|
Beschreibung
|
Bemerkung
|
Inspectable
|
Zeigt eine Eigenschaft im Komponenten- und Eigenschafteninspektor an, um sie dort einzustellen.
|
|
InspectableList
|
Beschreibt die Eigenschaften, die sowohl im Eigenschafteninspektor als auch im Komponenteninspektor sichtbar sein sollen. Ohne Angabe dieses Tags werden in beiden Bedienfeldern dieselben Parameter angezeigt.
|
|
Event
|
Definiert ein Komponenten-Ereignis.
|
Funktioniert nur im Zusammenspiel mit der Klasse mx.events.UIEvent der Macromedia-Komponenten.
|
Bindable
|
Macht eine Eigenschaft in dem Bindungen-Register des Komponenteninspektors zugänglich, so dass diese mit anderen Eigenschaften verknüpft werden kann.
|
Funktioniert nur im Zusammenspiel mit den DataBindingClasses der Macromedia-Komponenten.
|
ChangeEvent
|
Legt ein Ereignis fest, das durch Datenbindung ausgelöst wird.
|
Funktioniert nur im Zusammenspiel mit den DataBindingClasses der Macromedia-Komponenten.
|
Collection
|
Beschreibt eine Sammlung von Eigenschaften (engl. Collection), die im Komponenteninspektor angezeigt wird.
|
Funktioniert nur im Zusammenspiel mit der Klasse mx.utils.CollectionImpl der Macromedia-Komponenten.
|
IconFile
|
Legt den Dateinamen für eine PNG-Datei fest, die als Piktogramm für die Komponente verwendet wird.
|
|
Metadaten interpretieren
Um Flash dazu zu bewegen, Metadaten zu interpretieren, geben Sie die Klasse mit den Metadaten als Quelle in der Komponentendefinition innerhalb der Bibliothek über Optionsmenü • Komponentendefinition für jedes einzelne Symbol an. Die Metadaten werden ab dann für jede Instanz berücksichtigt. Das folgende Skript erzwingt, dass der Parameter elan im Eigenschafteninspektor und Komponenteninspektor angezeigt und bearbeitet werden kann:
class Frau extends MovieClip {
inspectable
[Inspectable]
var elan:Number = 100;
function Frau() {
}
function onEnterFrame() {
// Bewege auf und ab
_y = Math.sin(getTimer()/500)*elan+200;
}
}
Es reicht für jede Eigenschaft oder Getter-/Setter-Methode aus, dieser ein [Inspectable] voranzustellen, um den Wert in der Entwicklungsumgebung komfortabel einstellen zu können. Bei Bedarf dürfen Sie mit Inspectable noch weitere Vorgaben wie z.B. den in den Bedienfeldern anzuzeigenden Namen machen:
class Frau extends MovieClip {
[Inspectable(name="Super Elan", defaultValue=50)]
var elan:Number;
function Frau() {
}
function onEnterFrame() {
// Bewege auf und ab
_y = Math.sin(getTimer()/500)*elan+200;
}
}
Änderungen werden nicht übernommen
Flash MX 2004 erkennt Änderungen an den Metadaten-Tags einer Klasse nicht immer. In diesem Fall gibt es verschiedene Strategien, diese Aktualisierung zu erzwingen. Meist reicht es aus, in den Komponentendefinitionen der Komponente die Klasse noch einmal neu hineinzuschreiben. Sollte dies nicht funktionieren, dann hilft es oft, die zugehörige ASO-Datei (siehe ASO im Kapitel »ActionScript 2.0«, Seite 403) zu löschen. Und wenn dies auch nicht zum gewünschten Ergebnis führt, dann bleibt nur noch der Versuch, Flash neu zu starten.
Tabelle 17.9
Attribute des Inspectable-Tags
Attribute
|
Typ
|
Beschreibung
|
defaultValue
|
String oder Number
|
Ein optionaler Standardwert für die Eigenschaft.
|
enumeration
|
String
|
Legt eine durch Kommata getrennte optionale Liste für erlaubte Werte fest.
|
listOffset
|
Number
|
Steht aus Kompatibilitätsgründen mit Flash MX zur Verfügung, um optional den Standardindex einer List anzugeben.
|
name
|
String
|
Die optional angezeigte Bezeichnung einer Eigenschaft.
|
type
|
String
|
Optionale Typangabe für die Eigenschaft. Zur Auswahl stehen: Array, Boolean, Color, Font Name, List, Number, Object und String.
|
variable
|
String
|
Steht aus Kompatibilitätsgründen mit Flash MX zur Verfügung, um optional den Variablennamen der Eigenschaft anzugeben.
|
verbose
|
Number
|
Legt optional fest, welche Eigenschaften nicht im Eigenschafteninspektor, sondern nur im Komponenteninspektor zu sehen sein sollen (verbose = 1).
|
|