|
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Runtime version
Пробую запустить программу Korchy по внедрению шрифтов.
Создал файл Font1.fla, в котором вот такие настройки: PROPERTIES: LINKAGE: Далее, создал файл класса, который он привел в своем блоге, подставив имена, а также оставив только одну строку с регистерфонт: package { import flash.display.Loader; import flash.display.LoaderInfo; import flash.events.Event; import flash.events.EventDispatcher; import flash.net.URLRequest; import flash.text.Font; public class FontsManager extends EventDispatcher { private var FontsLoader:Loader; private var FontsLoaderInfo:LoaderInfo; private var FontsLoaded:Boolean; // Константы событий public static const FONTS_LOADED:String = "EvFontsLoaded"; // шрифт загружен public function FontsManager() { // Конструктор super(); FontsLoaded = false; } public function LoadFontsFromExternalSWF(Value:String):void { // Загрузить swf со шрифтами if (FontsLoaded == false) { FontsLoader = new Loader(); FontsLoaderInfo = FontsLoader.contentLoaderInfo; FontsLoaderInfo.addEventListener(Event.COMPLETE, OnFontsLoaded); FontsLoader.load(new URLRequest(Value)); } } private function OnFontsLoaded(e:Event):void { // SWF со шрифтами загружена if(FontsLoaded==false) { Font.registerFont(Class(LoaderInfo(e.target).applicationDomain.getDefinition("CyrillicHover"))); // Font.registerFont(Class(LoaderInfo(e.target).applicationDomain.getDefinition("FontName1Italic"))); // Font.registerFont(Class(LoaderInfo(e.target).applicationDomain.getDefinition("FontName1Bold"))); // Font.registerFont(Class(LoaderInfo(e.target).applicationDomain.getDefinition("FontName2"))); FontsLoaded = true; FontsLoaderInfo.removeEventListener(Event.COMPLETE, OnFontsLoaded); dispatchEvent(new Event(FontsManagerVn.FONTS_LOADED)); } } public static function CorrectFontName(vFontName:String, vFontSize:uint=12):String { // Проверка, есть ли такой встроенный (загруженный из сторонней SWF) шрифт заданного размера // если есть - возвращает его имя, если нет - возвращает исходное имя шрифта var EmbeddedFonts:Array = Font.enumerateFonts(false); for (var i:uint = 0; i < EmbeddedFonts.length; i++) { if (Font(EmbeddedFonts[i]).fontName == vFontName + "_" + String(vFontSize) + "pt_st") { return vFontName + "_" + String(vFontSize) + "pt_st"; } } return vFontName; } } } package { import flash.display.*; import flash.events.*; import flash.net.*; import flash.text.*; public class Runtime_font_embed extends MovieClip { public function Runtime_font_embed() { var MyFontsManager:FontsManager = new FontsManager(); MyFontsManager.addEventListener(FontsManager.FONTS_LOADED, Continue); MyFontsManager.LoadFontsFromExternalSWF("Font1.swf"); var text1 = new TextField(); var format1 = new TextFormat(); format1.font = FontsManager.CorrectFontName("CyrillicHover", 30); text1.setTextFormat(format1); } } } Цитата:
Что не так с этим FontsManagerVn? |
|
|||||
2 Fogflasher
Да, это моя опечатка - это же название собственно класса. Уберите буковки Vn в конце наименования класса в строке dispatchEvent(new Event(FontsManagerVn.FONTS_LOADED)); должно быть так: dispatchEvent(new Event(FontsManager.FONTS_LOADED));
__________________
interplanety |
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Korchy, Спасибо, исправил.
Но появилась теперь другая ошибка: Цитата:
|
|
|||||
2 Fogflasher
> Функция Continue будет вызвана после загрузки swf со шрифтами для продолжения работы программы. Создайте функцию с таким именем, или со своим, и его подставьте в эту строчку. После того, как шрифт будет загружен, будет произведен вызов этой функции. В эту функцию вынесете вот этот кусок так, как сделано у вас сейчас - вы хотите начать работать со шрифтом, не дожидаясь его загрузки, что явно не получится.
__________________
interplanety |
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
А можно как-то на примере это в коде показать?
Вот например я пробую так: package { import flash.display.*; import flash.events.*; import flash.net.*; import flash.text.*; public class Runtime_font_embed extends MovieClip { public function Runtime_font_embed() { // Оформив класс загрузчика шрифтов, в основной функции проекта вызываем загрузку: var MyFontsManager:FontsManager = new FontsManager(); MyFontsManager.addEventListener(FontsManager.FONTS_LOADED, Continue); MyFontsManager.LoadFontsFromExternalSWF("Font1.swf"); } public function Continue() { var text1 = new TextField(); var format1 = new TextFormat(); format1.font = FontsManager.CorrectFontName("CyrillicHover", 30); text1.setTextFormat(format1); } } } Цитата:
Последний раз редактировалось Fogflasher; 26.07.2013 в 12:25. |
|
|||||
2 Fogflasher
Вы прочитали у Мука главу посвященную обработке событий? Функция Continue - обработчик события. Обработчики требуют указания в параметрах события, которое они получают. О чем вам в ошибке впрямую и пишется - функция ожидает 0 параметров, а получает 1. Обозначьте параметр, ответственный за событие:
__________________
interplanety |
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Korchy, жаль если я раздражаю вас своей тупостью, но да, я ее читал.
Правда скорее в ознакомительном режиме, без закрепления всех деталей и ньюансов, для понимания. Подозрение на аргументы у меня было, но я воспринял смысл ошибки как прямо противоположный: "Ждет 0, имеет 1", как будто бы "некий аргумент уже есть... и то что я его не вижу еще нихрена не означает, мало ли..." А тут всё проще оказалось. Теперь программа работает без ошибок. Значение format1.font трэйсится как CyrillicHover_30pt_st, что очевидно правильно. Однако проблема в том, что фонт почему-то не применяется. Я сначала подумал что код функции Continue имеет ошибки: public function Continue(e:Event) { var text1 = new TextField(); text1.autoSize = TextFieldAutoSize.LEFT; text1.x = 80; text1.y = 80; text1.width = 200; text1.text = "Text Embedding - это непросто!"; var format1 = new TextFormat(); format1.font = FontsManager.CorrectFontName("CyrillicHover", 30); format1.color = 0x0011CC; format1.size = 30; format1.align = TextFormatAlign.LEFT; text1.setTextFormat(format1); trace("text1.text", text1.text); trace("format1.font", format1.font); addChild(text1); } Может быть проблема в файле Fonts.fla? Может я чего-то недопонял и какой-то код там должен быть. Добавлено через 22 минуты Блин, всё же очень просто... 'Слона то я и не приметил', забыл строку: Korchy, Теперь всё работает, благодарю за помощь! ^_^ Последний раз редактировалось Fogflasher; 26.07.2013 в 15:08. |
Часовой пояс GMT +4, время: 08:58. |
|
« Предыдущая тема | Следующая тема » |
Теги |
font embedding , runtime , внедрение шрифтов , шрифт |
|
|