Tag Flex

FemtoPlayer – mini free mp3 flash player

Kilka dni temu szukałem malutkiego mp3 playera, który wyświetlał by jedynie ikonkę z przyciskiem play i odgrywał wskazany dźwięk mp3. Poszukiwania w googlu dały kilka rezultatów, ale każdy z nich albo był “za bardzo”, albo miał złą licencję. Zamiast tracić dalej czas napisałem te kilkanaście linijek kodu i stworzyłem swój własny FemtoPlayer – Femto to brzmi dumnie ;)

Parametry:

file = pathToMP3 //ścieżka do pliku mp3
autoplay = true|false //czy automatycznie odgrywać dźwięk po wczytaniu

Przykład użycia:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="20" height="25" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="FlashVars" value="file=test.mp3&amp;autoplay=true" /><param name="src" value="FemtoPlayer.swf" /><param name="wmode" value="transparent" /><param name="flashvars" value="file=test.mp3&amp;autoplay=true" /><embed type="application/x-shockwave-flash" width="20" height="25" src="FemtoPlayer.swf" wmode="transparent" flashvars="file=test.mp3&amp;autoplay=true"></embed></object>

SWF do pobrania: download

Wywoływanie metod pomiędzy plikami SWF

Problem: Plik swf utworzony w actionscript2 będzie osadzony w innym pliku swf utworzonym w actionscript3. W jaki sposób z jednego pliku swf wywołać metodę w drugim?

Rozwiązaniem jest użycie klasy LocalConnection. Oto przykładowy kod:

embeded.swf (actionscript 2):

on(release) {
	var localConnection:LocalConnection = new LocalConnection();
	localConnection.send("holderConnection", "myMethod");
}

holder.swf (actionscript 3):

import flash.net.LocalConnection;
 
public class Holder
{
    public function Holder()
    {
        var localConnection:LocalConnection = new LocalConnection();
	localConnection.client = this;
	localConnection.connect("holderConnection");
    }
 
    public function myMethod():void
    {
        trace('metoda myMethod została wywołana');
    }
}

Należy zwrócić uwagę, aby metody które chcemy wywołać były zdefiniowane jako metody publiczne.

Preprocesor dla ActionScript

Preprocesor to narzędzie, które parsuje kod źródłowy programy przed poddaniem go kompilacji. Umożliwia to np. utworzenie warunkowych fragmentów kodu, które w specyficznych sytuacjach są dołączane do pliku wynikowego. Niestety, flex nie udostępnia nam takiego mechanizmu. Możemy jednak sami podpiąć zewnętrzny preprocesor.

Proponuję do tego celu użyć np. programu cpp (C Preprocesor). Jest to chyba jeden z bardziej rozbudowanych tego typu programów. W systemach Linux jest on prawie na pewno preinstalowany, w Windows możemy go uruchomić dzięki pakietowi Cygwin. Oczywiście cpp nie jest jedynym zdatnym dla nas preprocesorem – możemy w jego miejsce zastosować inny.

OK, a więc teraz pora na mini HOW-TO – jak podpiąć cpp do FlexBuildera – wersja dla Windows:

W pierwszym kroku należy ściągnąć i zainstalować cygwin, oraz doinstalować do niego kompilator C (to właśnie w nim znajduje się cpp).

Następnie utwórz skrypt:

c:
cd c:\cygwin\bin\
 
FOR /R %1 %%F IN (*.as) DO (
	@COPY /Y "%%F" "%%F.cpp-bak"
	cpp.exe -E -P -C '%%F' -o '%%F.cpp-processed'
	@MOVE /Y "%%F.cpp-processed" "%%F"
)

i zapisz go pod nazwą cpp.bat. Utwórz drugi skrypt:

@ECHO off
 
FOR /R %1 %%F IN (*.as) DO (
	@MOVE /Y "%%F.cpp-bak" "%%F"
)

i nazwij go cpp_restore.bat.

Teraz, w FlexBuilder, w ustawieniach projektu wybierz zakładkę Builders i utwórz nowego “budowniczego” klikając w przycisk New. W okienku, które się otworzy, w polu Name: wpisz nazwę np. Preprocesor, w polu Location: wpisz pełną ścieżkę do skryptu cpp.bat, a w polu Arguments: wpisz “${project_loc}”. Zatwierdź wciskając OK.

Teraz dokładnie to samo zrób dla drugiego skryptu, podaj tylko inną nazwę np. Preprocesor – restore.

Gdy już utworzysz obydwu “budowniczych”, ustaw ich w następującej kolejności:
- Preprocesor
- Flex
- Preprocesor – restore

Zrobione. Teraz możesz już używać instrukcji preprocesora w swoim kodzie. Dokumentację do niego znajdziesz pod adresem gcc.gnu.org/onlinedocs/cpp/.

Uwaga
Jest pewna wada przedstawionego rozwiązania. Ponieważ preprocesor usuwa linie zawierające jego rozkazy, wobec tego numery linii w komunikatach o błędach ActionScript nie będą się pokrywały z rzeczywistością. Rozwiązaniem byłoby wymuszenie na preprocesorze wstawiania pustych linii w miejsce usuniętych – niestety na razie nie wiem jak to skutecznie zrobić.

Szerokość i wysokość aplikacji actionscript 3

Bawiąc się dalej FlexBuilderem, natrafiłem na problem z ustawieniem rozmiarów aplikacji actionscript. W ustawieniach projektu nie znajdziemy odpowiednich opcji, nie da się ich również podać w argumentach kompilatora. Okazuje się, że robi się to poprzez metatag [SWF] wstawiony przed definicją głównej klasy projektu:

package
{
  [SWF(width="800", height="600", backgroundColor="#ffaa22")]
  public class MyApp extends Sprite  {
    //...
  }
}

Osadzanie fontów w aplikacji actionscript 3

ActionScript 3 pozwala na osadzanie (embedding) fontów bezpośrednio w aplikacji. Co by się zbytnio nie rozwodzić oto działające rozwiązanie:

public class Epeiron2 extends Sprite {
[Embed(source="c:/windows/fonts/AstalametPure.ttf", fontFamily="AstalametPure")]
 
private var fontTemp:String;
 
var format:TextFormat = new TextFormat();
format.font='AstalametPure';
 
textField1:TextField=new TextField();
textField1.defaultTextFormat=format;
}

Zauważcie, że w wersji beta metatag Embded był umieszczany poza klasą, w sekcji package. Obecnie jednak należy go umieszczać tak jak na przykładzie powyżej.

Linia:

private var fontTemp:String;

może budzić zdziwienie ale jest konieczna właśnie w tym miejscu – ponieważ osadzony plik jest przypisywany do najbliższej zmiennej.

Można także zabudować font, nie podając ścieżki do niego, ale jego nazwę. Oczywiście taka nazwa musi być zarejestrowana w systemie:

[Embed(systemFont="Astalamet Pure", fontFamily="AstalametPure")]

O banialukach w stylu “osadzanie fontów powoduje zwiększenie objętości pliku swf” nie będę pisał :)

Copyright © Kubiczek devblog
I'm lovin' it ;)

Built on Notes Blog Core
Powered by WordPress