загрузка шрифта во время выполнения в Flash / AS3

Представьте, что вы создаете презентацию, которая будет переведена на дюжину разных языков, включая языки с нелатинскими символами (например, китайский). Руководство по стилю брендинга клиента требует, чтобы определенные шрифты были приемлемы для определенных языков. Само содержимое должно быть экстернализовано, чтобы текст можно было заменить, даже не открывая .fla или повторно сохраняя графику.

Итак, мы говорим о динамических TextField s, заполненных из XML, с замененным шрифтом для соответствия языку зрителя - какой самый безболезненный способ динамически загружать только требуемые шрифты (независимо от размера файла) и применять их по мере необходимости? Я ищу решения, использующие только Flash, а не Flex.


person matt lohkamp    schedule 22.10.2008    source источник


Ответы (4)


Это немного хлопотно во флэш-памяти, но вполне возможно. Что вам нужно сделать, так это «встроить» шрифт в отдельный swf, загрузить этот swf из вашего основного приложения, а затем также зарегистрировать этот шрифт внутри этого swf. Это позволит вам выполнять загрузку шрифтов во время выполнения. Это потребует от вас указать шрифт для каждого языка в приложении или в любых файлах, в которых вы храните переводы, что, возможно, не идеально, но ни то, ни другое не встраивает все шрифты в ваше основное приложение. Это может составить сотни килобайт загруженных без всякой причины шрифтов.

Это Сообщение в блоге содержит хорошее изложение того, что вам нужно сделать, чтобы оно заработало. Я тоже сделал это сам, поэтому, если вам интересно, я могу позже дополнить этот пост некоторыми примерами.

person grapefrukt    schedule 23.10.2008
comment
Мне бы хотелось несколько примеров! Я тоже наткнулся на это сообщение в блоге, и мне показалось, что это было то, что мне нужно ... но я не очень разбираюсь в концепциях абстрактного кода - мне действительно нужно увидеть что-то твердое и поиграть с этим, прежде чем я это пойму. - person matt lohkamp; 23.10.2008

Я полностью разочарован тем, что об этом никто не знал - да ладно. Наконец-то я нашел человека, который написал небольшой класс для обработки процесса загрузки шрифтов и дал указания, как создать .swfs для его загрузки:

Загрузка шрифтов Flash AS3

Надеюсь, другие люди сочтут это полезным - это оказалось чудодейственным средством от моих проблем.

person matt lohkamp    schedule 29.10.2008
comment
Ссылка умерла, вот обратная ссылка: http://web.archive.org/web/20120904160747/http://www.mokisystems.com/blog/flash-as3-loading-fonts/ - person chichilatte; 17.01.2014

Что ж, вы узнаете, какой язык загружаете. Автоопределение может быть довольно сложным.

Предполагая, что вы знаете, на каком языке находится контент, вы можете зарегистрировать шрифты для использования во время выполнения, используя Font.registerFont (); С его помощью вы можете загрузить SWF-файл, содержащий шрифт, зарегистрировать его, и он будет доступен для будущего использования во всех текстовых полях. print («образец кода»);

[Embed(src="someFont.ttf", fontFamily="myFont", mimeType="application/x-font")]
private var fontClass:Class;

...

Font.registerFont(fontClass);

Обратите внимание, что для поддержки тега Embed вам придется компилировать с использованием гибкого компилятора.

Кроме того, хорошей утилитой является Font.hasGlyphs ( ), с помощью которого вы можете проверить, доступны ли символы, которые вы используете, во встроенных шрифтах. Это можно использовать либо для возврата к системному шрифту, либо для отображения предупреждения вам как разработчику (если вы забыли какие-то символы или что-то еще). Создание подкласса TextField для автоматической проверки может быть хорошей идеей.

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

person Antti    schedule 22.10.2008
comment
к счастью, автоматическое обнаружение не является частью этого - в ситуации, когда об этом ничего не известно, я бы сказал, что лучшим решением было бы попытаться определить вероятное географическое местоположение, посмотрев на их IP-адрес, интернет-провайдер, связанный с это, затем сделайте этот язык языком по умолчанию в раскрывающемся списке возможных локалей. - person matt lohkamp; 22.10.2008
comment
То, что я здесь говорю, все еще применимо к вопросу; встраивание шрифтов для использования во время выполнения с динамическим содержимым. Так или иначе, работал на недавно созданном сайте с 23 языками. Если вы используете флеш-память, вы все равно можете зарегистрировать шрифты и встроить их с помощью библиотеки. Однако использование flex сделает это намного проще .. - person Antti; 22.10.2008
comment
Я знаю, я знаю - поверьте мне, если бы я мог, я бы сделал это. Но это должен быть просто Flash, а не Flex - как бы вы в этой ситуации зарегистрировали шрифты и встраивали их с помощью библиотеки? - person matt lohkamp; 22.10.2008

Прежде всего, убедитесь, что вы установили ожидания, чтобы никто не подумал, что вы будете использовать встроенные шрифты на азиатских языках, таких как китайский и японский. Если вы не планируете загружать несколько мегабайт глифов, вы будете использовать шрифты устройства, точка. Таким образом, разумно иметь рекомендации относительно того, какой класс шрифта использовать - _sans, _serif, _typewriter или их локализованные эквиваленты, - но не рекомендации по шрифту как таковому.

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

Клиенты любят требовать, чтобы весь их основной текст был написан на Garamond-Extra-British или что-то еще, но убедитесь, что они знают о связанных с этим расходах. Если они увидят свет, вы избавите себя от значительной боли.

person fenomas    schedule 22.10.2008
comment
Без обид, но вы предложили не столько ответ, сколько рекомендацию, как избежать проблемы, и притом не очень реалистичную. - person matt lohkamp; 22.10.2008
comment
Например, предположим, что ваш клиент - Intel - по моему опыту, обойтись без Neo Sans просто невозможно. То же самое с Cicso или HP - руководство по стилю бренда существует не просто так, и если вы не желаете создавать для них проект с использованием их шрифтов, они заплатят кому-то другому, чтобы он сделал это. - person matt lohkamp; 22.10.2008
comment
Вы не дали мне достаточно информации, чтобы знать, реалистичен ли мой ответ. Если предлагается динамическая загрузка 5 мегабайт китайского шрифта, значит, вы не создаете очень типичный флэш-контент. - person fenomas; 22.10.2008
comment
Что касается остального, я знаком с крупными компаниями и руководствами по брендам, но разумно - нет, предпочтительнее - объяснить, что существуют затраты, которые их руководство по брендам не принимает во внимание. Если они хотят оплатить эти расходы, штраф; по моему опыту, они часто этого не делают. - person fenomas; 22.10.2008
comment
честно говоря, очевидно, что у нас был довольно разный опыт с этим, но на данный момент давайте предположим, что шрифты, предписанные клиентом, не подлежат обсуждению, и что они готовы пожертвовать временем загрузки для этого. - person matt lohkamp; 22.10.2008
comment
Думаю, я перефразирую вопрос для будущих разъяснений. - person matt lohkamp; 22.10.2008