Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не могу зарегистрировать шрифт (http://www.flasher.ru/forum/showthread.php?t=169912)

Universe 14.10.2011 14:21

Не могу зарегистрировать шрифт
 
Пытаюсь сделать динамическую подгрузку шрифтов в приложение. Создаю флешку в которой создаю новый шрифт, делаю ему Linkage.
Затем в основном классе делаю загрузку этой свф"ки. Всё вроде бы ок, он спотыкаюсь при регистрации шрифта! В чём я допустил ошибку?

Код AS3:

package 
{
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLRequest;
        import flash.text.Font;
        import flash.text.TextField;
        import flash.text.TextFieldAutoSize;
        import flash.utils.describeType;
        import flash.display.MovieClip;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import flash.text.AntiAliasType;
        /**
        * ...
        * @author Andrey
        */

        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
 
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        loadFont("../lib/fontTest.swf");
                }
 
                  private function loadFont(url:String):void
                  {
              var loader:Loader = new Loader();
              loader.contentLoaderInfo.addEventListener(Event.COMPLETE, fontLoaded);
              loader.load(new URLRequest(url));
                          trace("LOADING...");
          }
 
          private function fontLoaded(e:Event):void
                  {
                                trace(e.target.applicationDomain.getDefinition("Alba"));
                            var FontLibrary:Class = e.target.applicationDomain.getDefinition("Alba") as Class;
                                Font.registerFont(FontLibrary.Alba);    //Вот тут вылазит ошибка [Fault] exception, information=TypeError: Error #2007: Параметр font не должен быть равен нулю.
                          drawText();
          }
 
          public function drawText():void
                  {
              var tf:TextField = new TextField();
              tf.defaultTextFormat = newTextFormat;
              tf.embedFonts = true;
              tf.antiAliasType = AntiAliasType.ADVANCED;
              tf.autoSize = TextFieldAutoSize.LEFT;
              tf.border = true;
                          tf.textColor = 0x000000;
              tf.text = "Scott was here\nScott was here too\nblah scott...:;*&^% ";
 
 
              addChild(tf);
          }
        }
 
}


stweet 14.10.2011 14:28

Код AS3:

package stlib.fon
{
        import flash.text.Font;
 
        public class RegistrationFonts extends Font
        {
 
                [Embed(source = 'sours/ARIAL.TTF',
                        fontFamily = 'arial',
                        embedAsCFF = 'false')]
                        private var Arial1:Class;
 
                [Embed(source = 'sours/ARIALBD.TTF',
                        fontFamily = 'arialbd',
                        embedAsCFF = 'false')]
                        private var Arial2:Class;
 
                [Embed(source = 'sours/ARIALBI.TTF',
                        fontFamily = 'arialbi',
                        embedAsCFF = 'false')]
                        private var Arial3:Class;
 
                [Embed(source = 'sours/ARIALI.TTF',
                        fontFamily = 'ariali',
                        embedAsCFF = 'false')]
                        private var Arial4:Class;
 
                [Embed(source = 'sours/ARIBLK.TTF',
                        fontFamily = 'ariblk',
                        embedAsCFF = 'false')]
                        private var Arial5:Class;
 
                [Embed(source = 'sours/WEBDINGS.TTF',
                        fontFamily = 'webdings',
                        embedAsCFF = 'false')]
                        private var Sumbol1:Class;
 
                [Embed(source = 'sours/WINGDING.TTF',
                        fontFamily = 'wingding',
                        embedAsCFF = 'false')]
                        private var Sumbol2:Class;
 
                public function RegistrationFonts()
                {
                        registerFont(Arial1);
                        registerFont(Arial2);
                        registerFont(Arial3);
                        registerFont(Arial4);
                        registerFont(Arial5);
                        registerFont(Sumbol1);
                        registerFont(Sumbol2);
                }
 
                // get all font name
                static public function get ALLFONTNAME ():String
                {
                        var _ALLFONTNAME        :String        = '';
 
                        var _arr                :Array        = Font.enumerateFonts();
                                _arr.sortOn ( "fontName", Array.CASEINSENSITIVE );
 
                        for (var i:int = 0; i < _arr.length; i++)
                                if (i != _arr.length - 1) _ALLFONTNAME += _arr[i].fontName + "\n";
                                else _ALLFONTNAME += _arr[i].fontName;
 
                        return _ALLFONTNAME;
                }
        }
}

Код AS3:

        public class Main extends Sprite 
        {
                RegistrationFonts;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
 
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        // startup
                }
        }


trng 14.10.2011 14:34

Из хелпа к Font:
Класс Font нельзя использовать для загрузки внешних шрифтов или для создания своего экземпляра Font. Класс Font следует использовать как абстрактный базовый класс.
Из хелпа к FontAsset:
FontAsset – это подкласс класса flash.text.Font, который представляет шрифты, встраиваемые в приложение Flex.
Встраиваемый шрифт может быть шрифтом TrueType (TTF) или OpenType (OTF).

Universe 14.10.2011 16:00

немного не понял ваш пример. Получается если я сделаю как у вас и у меня будет допустим 100 шрифтов, то юзеру придётся сидеть и ждать пока все 100 шрифтов загрузятся? Может тогда разбить всё на маленькие swf, в каждом из которых будет по шрифту и их подгружать, а уже после подгрузки регистрировать?

GBee 14.10.2011 16:04

Код AS3:

Font.registerFont(FontLibrary);


stweet 14.10.2011 16:15

где то у Мука читал как можно грузить шрифты по мере их надобности.

Добавлено через 1 минуту
Код AS3:

Получается если я сделаю как у вас и у меня будет допустим 100 шрифтов, то юзеру придётся сидеть и ждать пока все 100 шрифтов загрузятся?

в моём примере они вкомпилины в проект.

Universe 15.10.2011 13:00

To GBee: не, так тоже не прокатывает - выдаёт ошибку
[Fault] exception, information=ArgumentError: Error #1508: Указано недопустимое значение для аргумента font.

fish_r 15.10.2011 14:17

Кто то из ребят писал: делают swc-ку со шрифтами (при чем уже с набором нужных глифов), потом в проекте нужный подключают - никаких головных болей (и лишнего веса). Я это редко юзаю ибо с ИДЕ работаю, мне проще через иде - лентяй :)

in4core 15.10.2011 14:24

Цитата:

Кто то из ребят писал: делают swc-ку со шрифтами
Так в IDE и делают.

Так к слову, после подключения swc

Код AS3:

public class EventsController extends EventDispatcher implements IEventDispatcher
        {
                private static var _ed:EventDispatcher;
 
                private var _myriad:Font                                        = new Myriad_font as Font;
                private var _arial_bold:Font                                = new Arial_bold as Font;


dimarik 15.10.2011 14:30

Шрифты можно использовать без регистрации. Они будут доступны в том ApplicationDomain, куда загружены. Во флекс вовсе не используется механизм Font.registerFont(), потому что после этого невозможно выгрузить swf, содержащий этот шрифт. Вместо этого ввели понятие FontContext, который поддерживают все модули, созданные во флекс. Специальный билдер в модуле выдает UITextField или какой другой компонент, содержащий текст из своего контекста (ApplicationDomain). После этого в компоненте можно использовать embed fonts.

Статья.


Часовой пояс GMT +4, время: 23:26.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.