crusy.net

  • home.
  • photos.
  • about.

 

27
Oct

Fonts auslagern. [UPDATE]

By crusy|Coding, Flash|3 Comments

Es macht Sinn, verwendete Schriftarten in eine Flashanwendung einzubinden – so sind sie unabhängig vom Zielsystem verfügbar, und nicht zuletzt kann man erst dann (Alpha-)Tweens auf sie anwenden. Andererseits machen sie die Flashanwendung zum Teil sehr groß. Die Lösung? Die Schriftarten erstmal in eine separate SWF auslagern:

package x.y.z
{
import flash.display.Sprite;

public class Fonts extends Sprite
{
[Embed(systemFont='Arial', fontName="Foo", fontWeight='bold', mimeType='application/x-font')]
public static var Foo : Class;
}
}

Zu beachten: Die Klasse muss Sprite extenden; der FontName sollte ein anderer sein als der Fontname im System (um diesen nicht zu überdecken); Schriftschnitte wie bold oder italic müssen explizit eingebunden werden. Der Übersichtlichkeit halber benenne ich die Fonts (FontName) genauso wie die Klasse, in die sie embedded werden (hier: “Foo”)

Diese Klasse wird nun kompiliert, und die SWF unter einem Pfad, zB “fonts.swf” abgelegt. Unter diesem Pfad kann sie nun, etwa im Rahmen einer Preloader-Queue mit weiteren Assets, dynamisch von der eigentlichen SWF nachgeladen werden:

private var _loader:Loader;

private function loadFonts():void
{
_loader = new Loader();

_loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIoError);

_loader.load(“fonts.swf”, new LoaderContext(false, ApplicationDomain.currentDomain));
}

private function onIoError( error:IOErrorEvent ):void
{
// handle error
}

private function onProgress( event:ProgressEvent ):void
{
// display progress
}

private function onComplete( event:Event ):void
{
var AssetClass:Class = Class(ApplicationDomain.currentDomain.getDefinition(“x.y.z.Fonts”));
Font.registerFont( AssetClass["Foo"] );
}

Zu beachten hierbei: Es muss der komplette Package-Pfad (“x.y.z.Fonts”) an ApplicationDomain.getDefinition() übergeben werden! Nur der Klassenname genügt nicht.

Außerdem: Wann immer man den Text des entsprechenden TextField (neu) gesetzt hat, muss das TextFormat mit dem eingebundenen Font (neu) zugewiesen werden. Die Property embedFonts setzt man auf true:

tf.text = “Some text”;
tf.embedFonts = true;
tf.setTextFormat( new TextFormat(“Foo”) );

hth.

Tagged as: ApplicationDomain, embed font, Fonts, preloader
Add your comment →

3 Comments

  1. oder meinen FontManager.as benutzen, die sourcen haste ja noch vom glk projekt :-)

    By: ben
    November 7, 2008 at 05:51
  2. Soweit ich den verstanden habe, muss ich die Fonts aber auch erstmal geladen haben :-) hier würde er also die onComplete() ersetzen…

    das Ziel hier war, die Fonts im Rahmen *einer* Loading-Queue mit 20 anderen Assets verschiedensten Typs zusammen vorzuladen; hier habe ich nur den Font-Teil der Preloader-Logik gepostet. Was man nun machen kann, ist den Loader auszulagern, und ein eigenes PreloaderItem zu schreiben, das auch einen Callback (quasi ein spezifisches onComplete()) enthält. Nun kannst Du Grafiken laden, die über den enstprechenden Callback verarbeiten; und die Fonts-SWF über einen anderen Callback an die Font.registerFont übergeben. Trotzdem behälst Du *eine* Queue, und damit auch *eine* Fortschrittsanzeige. Hm, hat das eigentlich noch was mit Deinem Comment zu tun? Ich glaube nicht :-)

    By: crusy Author
    November 7, 2008 at 10:13
  3. PS: Die Grafik kommt aus den TextLineMetrics:
    http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/text/TextLineMetrics.html

    By: crusy
    March 3, 2009 at 09:21

Leave your comment below! Cancel Reply

View More Posts:
  • ←
  • →

Suche:

Schubladen:

  • Apropos (55)
  • Computer (211)
    • Arduino (4)
    • Coding (157)
      • CSS (5)
      • Flash (87)
      • Java (2)
      • Javascript (17)
      • PHP (5)
    • Firefox (18)
    • OS X (18)
  • Lustig (86)
  • Musik (50)
  • Photo (30)
    • Photoshop (16)
  • Video (57)
  • Web (94)
  • Werbung (28)

@crusy:

RT @DylanDogger: Paradox: Menschen, die über sich lachen können, nehme ich ernst.
33 minutes ago from web
RT @Afelia: RT @fagri Dann gehen wir morgen halt "vorerst" gegen ACTA demonstrieren. #stopacta
34 minutes ago from TweetDeck
Die Sonne scheint mir in's Gesicht. Das soll sie nicht.
2 days ago from web
optisch mittig my ass.
2 days ago from web
RT @Pseudonymphe: Mir pupsegal, ob ihr das Musik-Auto schon kennt - ich kannte es bis eben nicht. Und find's vollends GROSS! http://t.co/FlLHYhZp
2 days ago from web

Kommentare:

  • crusy on Van Gogh meets Monkey Island (und mehr!)
  • Stefan Heller on Van Gogh meets Monkey Island (und mehr!)
  • crusy on Arduino mit Eclipse als IDE
  • michael on Arduino mit Eclipse als IDE
  • crusy on AIR Native Extension für Arduino

Tags:

Actionscript Actionscript 3 Addon Adobe AIR Apple AS AS3 Coding Comment Cover CSS Eclipse Facebook FDT Fehlermeldung Film Firefox Flash Flex Font Google Internet iOS iPad iPhone Javascript Kommentar Kunst Mac music Musik Obama OS X OSX Photoshop PHP Plugin Star Wars Video Web Werbung Wordpress XML Youtube

Projekte

  • Bent Larsen
    DAS Film Noir Point-and-Click-Adventure
  • crusy goes sf
    Photoblog aus San Francisco
  • Insignia
    Aufbau. Handel. Herrschaft.
  • nerdeln.de
    Nörgeln für Nerds
  • Photos
    Mein Photoblog
  • Tourtagebuch
    Von sechs Menschen, einer Stadt und keiner Wohnung

Powered by the inLine Minimal WordPress Theme