
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
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.