Beiträge der Kategorie flash/flex

Events in eingenen Klassen definieren

Zunächst braucht man eine Klasse, die auf einem Objekt basiert, dass Events absenden kann (Event dispatcher). In diesem Beispiel wird die Klasse in einer ActionScript-Datei definiert und dann in MXML benutzt. Die Klasse muss unter dem Namen MyModule.as im Ordner classes abgelegt werden, andernfalls muss man den Package-Namen und den Klassennamen entsprechend anpassen.
Mit [Event ...] teilt man der Außernwelt mit, dass man Events vom Typ flash.events.Event mit dem Key „myEvent“ ausgibt.

package classes
{
[Event(name=“myEvent“, type=“flash.events.Event“)]

public class MyModule extends Module
{
public function myFunction():void
{
dispatchEvent(new Event(„myEvent“));
}
{
}

Der Flex Builder bietet myEvent beim ListModule bereits an. Wird dann in myFunction das entsprechende Event ausgelöst, wird der Inhalt der Funktin doSomething ausgeführt.


Geschrieben in flash/flex | Kommentare deaktiviert für Events in eingenen Klassen definieren

Flash Animation Spirale

Die schicke Animation hatte ich vor Jahren mal gemacht. Dabei wird über die Flash Zeichenfunktion in Abschnitten eine Spirale gezeichnet. Genauer gesagt 10 Stück, dann wird in einer onEnterFrame-Funktion die bereits gezeichnete nach und nach ausgeblendet. Zum Zeichnen der Spirale gibt es merhere Parameter – Radius, Krümmung, Drehung etc. Einer dieser Parameter wird nach Zufallsprinzip zwischendurch geändert.
Guckst du hier – Flash Animation Spirale

Geschrieben in flash/flex | Kommentare deaktiviert für Flash Animation Spirale

Randomize Array Funktion

Eine einfach Funktion, um ein Array zu mischen. Hab zwar einiges bei Google gefunden, wollte aber eine eigene Funktion haben (AS2):

Array.prototype.randomize = function() {
var tmp = this;
this = new Array();
while(tmp.length > 0) {
var pos = Math.floor(Math.random()*tmp.length);
this.push(tmp[pos]);
tmp.splice(pos,1);
}
return this;
}

Das Array wird kopiert und geleert, dann wird aus dem temporären Array ein Wert an einer zufälligen Stelle in das neue leere Array geschrieben und aus dem temporären gelöscht. Das macht man solange Werte im temporären Array sind.
Zu beachten:
– man kann nicht mit splice den Wert holen und gleichzeitig ins neue Array einfügen, da werden die Werte komisch gecastet und ein multidimensionales Array geht dabei kaputt
– die Funktion muss vor dem Funktionsaufruf stehen, ansonsten funktioniert es nicht

Geschrieben in flash/flex | Kommentare deaktiviert für Randomize Array Funktion

Double Click funktioniert nicht

Um ein Double Click Event abzufeuern, muss es aktiviert werden. Dann muss der EventListener hinzugefügt werden und seltsamerweise muss der Parameter mouseChildren auf false gesetzt sein, damit es funktioniert.

mc.doubleClickEnabled = true;
mc.mouseChildren = false;
mc.addEventListener(MouseEvent.DOUBLE_CLICK,doubleClickFunc,false,2);
function doubleClickFunc(event:MouseEvent) {
// do what you want here
}

FlashVars auslesen

An eine Flashanimation kann man per GET Variablen übergeben. Was man dabei beachten muss: in Flash CS3 wird aus Flash heraus beim Veröffentlichen eine HTML-Datei generiert, in der der Flash-Film mit einem JavaScript eingebunden wird. Früher war das einfach nur ein Object-Tag mit einem Embed-Tag.
Wenn man also einfach wir früher den Object-Tag nutzen möchte, schreibt man die Variablen, die man an Flash übergeben will einfach als GET-Parameter ans Ende des Flash-Aufrufs.

In Flash CS3 muss man die Variable flashVars in den Aufruf der Funktion eingebaut werden.
AC_FL_RunContent(
‚codebase‘, ‚http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0‘,
‚flashVars‘, ‚var=foo&var2=bar‘,

Um auf diese Variablen in Flash CS3 zuzugreifen, muss man ein Object der loaderInfo erzeugen.
var parameters:Object = this.loaderInfo.parameters;
Security.loadPolicyFile(parameters.serverURL +“/crossdomain.xml“);

In diesem Fall wurde die Variable ?serverURL=server an den Aufruf der Datei drangehängt.

In Flash bis Version 8 standen die per GET übergebenen Variablen einfach als _root.var zur Verfügung.

Geschrieben in flash/flex | Kommentare deaktiviert für FlashVars auslesen

Programmatic Skin für Buttons mit Variablen Farben

Auf einen Button in Flex soll ein Skin gelegt werden, damit die Buttons einfacher aussehen.

Dazu erstellt man eine Datei ButtonSkin im gleichen Ordner. Dort definiert man die Klasse ButtonSkin als Erweiterung der Klasse Programmatic Skin. Darin muss man die Funktion updateDisplayList neu schreiben. In diesem Beispiel wird der Button mit einem Rand versehen. In den ersten zwei Zeilen der Funktion wird auf die in der Hauptanwendung gesetzen Farben zugegriffen.

package
{
import mx.skins.ProgrammaticSkin;
public class ButtonSkin extends ProgrammaticSkin {
protected override function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
var fillColor:uint = this.getStyle(„themeColor“);
var lineColor:uint = this.getStyle(„color“);
graphics.clear();
graphics.beginFill(fillColor,1);
graphics.lineStyle(1,lineColor,1);
graphics.drawRect(0,0,unscaledWidth,unscaledHeight);
}
}
}

Um den „gehäuteten“ Button in der Anwendung zu benutzen, fügt man folgende Zeilen in den Code des Style-Abschnitts im MXML-File ein.

Button {
cornerRadius: 0;
highlightAlphas: 0, 0;
fillAlphas: 1, 1, 1, 1;
downSkin:ClassReference(‚ButtonSkin‘);
upSkin:ClassReference(‚ButtonSkin‘);
overSkin:ClassReference(‚ButtonSkin‘);
disabledSkin:ClassReference(‚ButtonSkin‘);
}

Geschrieben in flash/flex | Kommentare deaktiviert für Programmatic Skin für Buttons mit Variablen Farben

TabNavigator – Styles dynamisch zuweisen

In einem Tab-Navigator sollen die Styles, vor allem die Farben erst später gesetzt werden. Zunächst muss man die Stile für den TabNavigator fest definieren:

TabNavigator {
  backgroundColor: #8b8b8b;
  borderStyle: none;
  color: #ffffff;
  dropShadowEnabled: false;
  tabStyleName: "myTabs";
  firstTabStyleName: "myTabs";
  lastTabStyleName: "myTabs";
  selectedTabTextStyleName: "mySelectedTabs";
}

.myTabs {
  cornerRadius: 0;
  highlightAlphas: 0, 0;
  fillAlphas: 1, 1;
  fillColors: #ffffff, #ffffff;
  borderColor: #8b8b8b;
  color: #8b8b8b;
}

.mySelectedTabs {
  color: #ffffff;
  textRollOverColor: #ff9900;
}

Das macht man in einem Style-Abschnitt in der MXML-Datei. Dann kann man in einer Funktion auf die bestehenden Stile zugreifen und deren Attribute ändern.

// den TabNavigator CSS Style holen
var tabNavigatorStyle:CSSStyleDeclaration = StyleManager.getStyleDeclaration("TabNavigator");
// Hintergrundfarbe neu setzen (z.B. auf grün)
tabNavigatorStyle.setStyle("backgroundColor", 0x00FF00);
// den .myTabs CSS Style holen
var tabStyle:Object = StyleManager.getStyleDeclaration(".myTabs");
// z.B.cornerRadius setzen
tabStyle.setStyle("cornerRadius", 10);

Vielen Dank an Bort, den Flexperten auf dem Flex Forum.

Geschrieben in flash/flex | Kommentare deaktiviert für TabNavigator – Styles dynamisch zuweisen

Application auf Flash Media Server 2

Es gibt einige Beispiele auf der Adobe Seite, leider war da kein einziges, das Flash CS3 (mit AS3) und Flash Media Server 2 beschrieb. Hier sind einige Grundlagen:

Um eine Application zu erstellen, muss man im Ordner applications im Verzeichnis des Servers einen neuen Ordner anlegen, denn man dann z.B. „app“ benennt. In diesem Ordner erstellt man eine Datei namens „main.asc“, die dann die Logik der Anwendung beschreibt.

Bei FMS2 wird die Datei in AS2 geschrieben, d.h. keine Typbeschreibung in der Variablen-Deklaration, also kein var i:Number; Ausserhalb der Funktionen dürfen keine Variablen stehen. Wenn man Variablen initialisieren will, muss man das in der onAppStart tun.

Die Funktion onAppStart wird automatisch beim Laden der Anwendung aufgerufen, die geschieht, wenn ein Client sich mit der Anwendung verbinden will oder wenn man die Anwendung manuell startet.

application.onAppStart = function() { ... }

Die Funktion onConnect wird aufgerufen, wenn ein Client sich verbinden möchte. Die Verbindung kann man annehmen oder ablehnen.

application.onConnect = function(clientObj,clientName) {
  application.acceptConnection(clientObj);
}

Um eine Funktion beim Client aufzurufen, muss diese in der NetConnection definiert sein. Auf dem Server ruft man über call die Funktion auf.

Flash AS3 (Client)
var nc:NetConnection = new NetConnection(); // Rest siehe voriger Post
nc.eineFunktion = function(wert1,wert2) { ... }

main.asc in AS2 auf Server
clientObj.call("eineFunktion",null,wert1,wert2);
application.broadcastMsg("eineFunktion", wert1,wert2)

An zweiter Stelle steht eine CallBack-Funktion, die aufgerufen wird, wenn eine Antwort erwartet wird. In der zweiten Zeile wird die Funktion auf allen Clients ausgeführt, zu beachten ist hierbei, dass da die CallBack-Funktion fehlt.

Anderherum funktioniert es wie folgt: auf dem Server definiert man über prototype die Funktion in der Client-Klasse. In Flash ruft man sie über call auf.

Flash AS3 (Client)
nc.call(neueFunktion,null,wert3,wert4);

main.asc in AS2 auf Server
Client.prototype.neueFunktion = function(wert3,wert4) { ... }

Noch ein Tipp: sobald man die Datei als asc abgespeichert hat, kann man keine Syntax-Überprüfung machen (was fürn Schwachsinn). Den Quellcode einfach kopieren, neues Fenster auf, ohne Speichern Syntax checken lassen.

Geschrieben in flash/flex | Kommentare deaktiviert für Application auf Flash Media Server 2

Flash CS3 und Flash Media Server 2

Bin am verzweifeln gewesen – habe die Dokumente zum Flash Media Server 2 durchgelesen, dummerweise sind alle Beispiele für Action Script 2. In AS3 hat sich einiges geändert. Das waren schon die ersten Probleme: NetConnection.onStatus existiert so nicht mehr, bis man erstmal findet, wie man sich sonst korrekt mit dem Server verbinden kann, vergehen Studen. Und ein weiterer wichtiger Punkt: AS3 nutzt ein neues Format, um Action Script Daten zu übertragen, das aber leider inkompatibel ist mit dem alten Action Message Format (AMF). In allen Beispielen kein Wort davon, dass man dem AS3 mitteilen muss, dass anstatt AMF3 AMF0 verwendet werden soll.

NetConnection.defaultObjectEncoding = flash.net.ObjectEncoding.AMF0;

Und so baut man nun eine Connection auf:

private function init():void{
  nc = new NetConnection();
  nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus);
  nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, netSecurityError);
  nc.connect("rtmp:/myApplication");
}

private function netStatus(event:NetStatusEvent):void {
  var info:Object = event.info;
  trace(info.code);
}

private function netSecurityError(event:SecurityErrorEvent):void {
  trace("netSecurityError: " + event);
}

Diese Infos habe ich von der Seite Programming Flash Communication Server.

Geschrieben in flash/flex | Kommentare deaktiviert für Flash CS3 und Flash Media Server 2