Форум 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=125993)

AlexDesinger 06.06.2009 21:36

загрузка внешнего шрифта
 
Здравствуйте, подскажите алгоритм, если таковой есть, каким образом возможно использовать файл шрифта, находящийся в библиотеке внешнего swf, который подгружается в основной на этапе исполнения.
У Мука есть пример такого использования, но файл, содержащий шрифт создается, насколько я понял в Flex Builder, используя тег Embed.
Я попробовал с помощью Flash, но пока что не выходит:
файл swf:
в библиотеке файл шрифта "MyFont", у этого файла прописан Class в поле Class - "MyFont".
поле Base Class пустое
Поставлены галочки в полях :
Export for ActoionScript
Export in frame 1

файл MyFont.as:
Код AS3:

package{
        import flash.text.Font
        public class MyFont extends Font{
 
                public function MyFont(){
                        Font.registerFont(MyFont)
                }
        }
}

загрузка файла точно происходит, но текстовое поле остается пустым, если его попытаться форматировать с помощью подгруженного шрифта.

alekslitvinenk 06.06.2009 22:16

Не определяте класс для шрифта в загружаемой флешке: флеш это сделает сам, укажите только им класса, например "YouFontClassName". не ригистрируйте шрифт в загружаемой флешке.
регистрируйте шрифт в загружающей флешке:

Код AS3:

 
import flash.display.*;
import flash.events.*;
var myFont:Loader = new Loader();
myFont.contentLoaderInfo.addEventListener(Event.COMPLETE, encounterFont);
myFont.load(new URLRequest("ComSM.swf"));
function encounterFont(ev:Event):void{
    var loaderRef:LoaderInfo = ev.target as LoaderInfo;
    Font.registerFont(loaderRef.applicationDomain.getDefinition("MyFont") as Class);
    trace(Font.enumerateFonts()[0].fontName);// Comic Sans MS
}


AlexDesinger 06.06.2009 22:43

alekslitvinenk, спасибо, но сорри так не получается ничего, я пока что вот как сделал, я в подгружаемой swf ке назначил документ класс MyFont,
унаследовав его от MovieClip, трейс в основной swf ке видит [object MyFontt]
но я так понял что основная проблема в том, embedFonts, почему то убивает текст и он просто перестает изображаться
MyFont.as:
Код AS3:

package{
        import flash.text.Font
        import flash.display.MovieClip
        public class MyFont extends MovieClip{
 
                public function MyFont(){
                        Font.registerFont(MyFontt)//название фонта в библиотеке
                }
        }
}

Код AS3:

trace(Font.enumerateFonts())//[object MyFontt]

ууухх...е-мое, тк даже если я просто в библиотеку кину файл шрифта(например Vernada), расшарю его, то и тогда flash отказывается отображать его, скажите что не так делаю?

Ешкин, кот, меня уже волосы дыбом - добавил еще и Arial чтоб проверить, тк он ток латинницу отображает, народ хелп, неужели cs4 не работает с embed шрифтами?

alekslitvinenk 06.06.2009 23:44

исправил код выше

AlexDesinger 06.06.2009 23:48

Спасибо, можно походу и так и так, потому что даже во внешней swf ке - там где встроен файл шрифта создавая тестовое текстовое поле - таже беда - шрифт виден, но как только появляется embedFonts=true, все текст не виден ((((((((((((((((

alekslitvinenk 06.06.2009 23:50

Вложений: 2
исправил код выше...
Цитата:

я пока что вот как сделал, я в подгружаемой swf ке назначил документ класс MyFont,
унаследовав его от MovieClip, трейс в основной swf ке видит [object MyFontt]
что вы сделали ? O_o

AlexDesinger 06.06.2009 23:54

Ну я swf- ке назначил документ класс, в котором и зарегистрировал фонты, но дело не в этом, у вас кажется cs3 судя по интерфейсу, а у меня cs4 тк вот он напроч отказывается форматировать шрифт програмно встроенными шрифтами, даже если я форматирую тектовое поле, которое создается в документ классе swf ки, которая и содержит фонт =(

alekslitvinenk 07.06.2009 00:05

вы вормат к тексту когда применяете ?
нужно тогда, когда фонт уже загружен, т.е
Код AS3:

function encounterFont(ev:Event):void{
        var loaderRef:LoaderInfo = ev.target as LoaderInfo;
        Font.registerFont(loaderRef.applicationDomain.getDefinition("MyFont") as Class);
        trace(Font.enumerateFonts()[0].fontName);// Comic Sans MS
        mytxt.setTextFormat(new TextFormat("Comic Sans MS"));//Название шрифта должно совпадать не с названием класса, а с названием шрифта
}

P.S насколько я помню срузу после загрузки swf-ки не получалось применить форматирование, попробуте поставить 100-200 милисекунд задержки...

AlexDesinger 07.06.2009 00:12

дк, говорю же, дело в том что форматирование не получается даже если я буду не подгружать фонт, а просто его изначально в библиотеку встрою, в главную swf-ку, даже тогда embedFont убивает текст...
может импорт из библиотеки надо делать? Или экземпляр создавать?

Добавлено через 14 часов 52 минуты
Мдааа уж - супер, действительно видимо баг, единственный способ, которым получилось встроить внешний шрифт такой-
создаю внешний swf с текстфилдом на таймлайне, который лежит за пределами сцены, в нем обязательно должен быть текст, этот текст я отформатировал вручную, и embedom внедрил шрифт в этот текстфилд ( Внимание - все вручную!!!)
и все больше ничего не нужно - ни внедрение шрифтов в библиотеку, ни прописание классов, ни регистрация шрифтов кодом.
Затем в основном swf загружаю этот файл с текстфилдом, получаю ссылку на фонт текстфилда, сохраняю в public static переменной, и можно ей пользоваться везде - таким только образом получается внедрение шрифта.

вот синтаксис подгрузки, кому нужно:
Код AS3:

                var l:Loader=new Loader();
                        l.contentLoaderInfo.addEventListener(Event.INIT, initL);
                        l.load(new URLRequest("fonts.swf"));
                        function initL(e:Event):void {
                                l.contentLoaderInfo.removeEventListener(Event.INIT, initL)
                                addChild(l)
                                var ff:Object=l.content
                                var tt:TextFormat=new TextFormat()
                                tt=ff.MyTextField.getTextFormat()//TextField добавленный и отформатированный вручную во внешнем swf
                                myFont=tt.font
                        }


2Borik 11.06.2009 12:51

а кто нибудь может подсказать, как удалить динамически загруженный внешний шрифт из библиотеки?


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

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