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 (62)
  • Computer (222)
    • Arduino (4)
    • Coding (166)
      • CSS (5)
      • Flash (88)
      • Java (4)
      • Javascript (17)
      • PHP (6)
    • Firefox (19)
    • OS X (19)
  • Lustig (90)
  • Musik (52)
  • Photo (30)
    • Photoshop (16)
  • Video (58)
  • Web (95)
  • Werbung (29)

@crusy:

Lord Helmchen! (Der war bestimmt schon, oder?) #cl
19 hours ago from Twitter for Windows Phone
Fußball gucken ist ein bisschen wie Al Bundy gucken: Der Sprecher ist zwar unlustig, aber das Publikum klatscht trotzdem.
20 hours ago from Twitter for Windows Phone
Wenn man heiratet, ist man dann ent-ledigt?
1 day ago from web
Sach ich doch
3 days ago from Twitter for Windows Phone
SHER
3 days ago from Twitter for Windows Phone

Kommentare:

  • Christian on WSDL2Java: Axis2 in Eclipse Indigo
  • crusy on Deutschlandweite Verteilung Deines Namens
  • Jotteh on Deutschlandweite Verteilung Deines Namens
  • Fogwulf on Abgerundete Ecken
  • crusy on Van Gogh meets Monkey Island (und mehr!)

Tags:

Actionscript Actionscript 3 Addon Adobe AIR Ant Apple AS AS3 Coding Comment Cover CSS Design Eclipse Facebook FDT Film Firefox Flash Flex Google Internet iOS iPad iPhone Java Javascript Kommentar Mac music Musik Obama OSX OS X 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