Записки о Flash

ru.etcs.utils.FontManager

Класс ru.etcs.utils.FontManager от 19.03.07 v1.0.1

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

(FontManаger написан на AS2. Для AS3 существует FontLoader)

Преимущества FontManager:

  • Чистый инкапсулированный AS2-класс
  • Минимальное вмешательство в жизнь проекта
  • Не подключает дополнительных классов (кроме стандартного EventDispatcher)
  • Не требует кода в shared-библиотеках
  • Выполняет предзагрузку shared-библиотеки для отображения процесса загрузки шрифта
  • Не имеет ошибок в FDT (при Strict-настройке отлова ошибок в FDT, т.е. все опции в позиции Error)

Создание swf-файла со шрифтом (на примере Arial) для FontManager:

ВНИМАНИЕ! Описание создания библиотек описано для восьмой версии Flash. Работа в версиях ниже и выше не гарантируется (в седьмой версии допускается, но не проверялось).

1) Создаем новый fla проект, называем arial_shared.fla.

2) Создаем новый клип, заполняем поля:

Рис. 1

Name: ArialFont
Identifier: ArialFont
Export for runtime sharing
Export in first frame
В поле URL прописываем путь к swf-ке (о ней ниже), которая будет грузить данную шарную либу (arial.swf), но это необязательно, работать будет при любом заполненном URL (проверено).

3) В созданном клипе создаем динамическое текстовое поле с координатами 0,0. Указываем имя «field», шрифт и выключаем возможность выделения текста:

Рис. 2

На этом шаге вы можете набросать ещё полей с различными начертаниями шрифта, не заполняя Instance Name. После загрузки этой библиотеки их тоже можно будет использовать.

4) Нажимаем кнопку Embed и выбираем необходимые диапазоны экспортируемых шрифтов:

Рис. 3

5) Запускаем (компилируем), чтобы получить arial_shared.swf (обратите внимание на его размер, если все сделали правильно, он должен весить больше 1 КБ). На сцене ничего не должно быть, наш клип записан в первом кадре (export in first frame).

6) Сохраняемся. Шарная либа готова. Теперь нужно создать ролик, загружающий нашу шарную либу. Создаем новый fla проект, называем arial.fla, сохраняем. Создаем новый мувиклип SharedClip (задаем только имя, больше ничего):

Рис. 4

7) Нажимаем ОК, далее открываем библиотеку и свойства нашего клипа:

Рис. 5

Identifier пишем тот же, что и у ArialFont в arial_shared.
Ставим галочку import for runtime sharing и в поле URL вписываем путь к нашей шарной либе (arial_shared.swf).

8) Нажимаем ОК, кидаем наш SharedClip на сцену в 0,0, задаем ему имя «sharedClip»:

Рис. 6

9) Сохраняем проект и запускаем. Мы должны увидеть наш шарный клип в arial.swf (текстовое поле) и такой листинг переменных:

Рис. 7

Обратите внимание на путь sharedClip.field. Он должен быть именно таким, если вы правильно выполнили все шаги. В противном случае FontManager не сможет найти текстовое поле со шрифтом и выдаст ошибку.

10) Шрифт для FontManager готов! Ролики arial.swf и arial_shared.swf должны находится рядом друг с другом.

Пример работы FontManager. Исходники (не забудьте перед компилированием manager.fla скачать фреймворк с FontManager).

Документация в теле класса.

Класс доступен во фреймворке.


33 comments

33 Comments so far

  1. MureJIb March 20th, 2007 22:08

    Магия древних становится все более доступной ))

    Возможно кому то будет интересна еще одна реализация ))
    Сделал пару месяцев назад )
    http://bbexp.ru/tmp/SmartFont/support/index_ru.html

  2. MureJIb March 20th, 2007 22:11

    PS.

    Да, что хотел спросить ))
    В результате тестирования своего класса – обнаружил, что собственно качественный прелоадер сделать для шаровых библиотек мне так и не удалось – несмотря на то, что есть событие onLoadProgress.
    В конечном итоге цепляются байты не самого файла библиотеки, а файла, в который грузится библиотека – а он весит не более килобайта ))

    Как с этим вопросом обстоят дела у FоntManager ?

  3. __etc March 20th, 2007 22:15

    Никаких проблем ;)

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

    Плюс ко всему для FontManager не нужно ничего писать в кадрах либы (благодаря этому класс не будет зашит в либу).

  4. MureJIb March 21st, 2007 09:51

    Да, собственно свой класс я писал как исследование вопроса ).
    А глубину там можно менять.
    Он сырой, я это понимаю прекрасно. FоntManager, конечно, серьезная работа.
    Я, увы, далек от отличного владения всеми тонкостями ООП, гуманитарий я ))

  5. __etc March 21st, 2007 12:27

    Да там пришлось поковыряться, чтобы не накосячить с областями видимости, но все работает, вроде…

  6. distinctive April 6th, 2007 15:28

    Это что получаеться тебе запретили исходник выкладывать?
    и почему в комерческих целях?
    …непонятно, как то.

    статью читал…
    исходник подгружаемых шрифтов не качал ))
    черт!

  7. __etc April 6th, 2007 19:14

    Я жду ответа от Adobe.

  8. Nirth April 11th, 2007 08:57

    Мухахахаха
    http://casaframework.org/docs/ -> FontManager
    классы уже в фреймворки засовывают=)

  9. __etc April 11th, 2007 10:43

    Да я вижу. Только там криво все, мой лучше :D

  10. [...] документацию к FontManager. Версия класса пока старая, в будущем будет апгрейд с [...]

  11. ruslan January 20th, 2008 18:28

    Переходите на as3.0. Там можно без Shared библиотек. А прелоадер и не получится – флаш грузит Shared библиотеки до того, как скрипты начинают крутиться. В принципе ничего нового для себя не обнаружил, думал и впрямь кто-то нашел способ подгружать шрифты динамически… Пишите на as3.0 :-)

  12. __etc January 20th, 2008 18:49

    На AS3 уже давно пишем, FontManager создан для AS2-проектов, к тому же довольно давно, как можно было заметить.
    Для AS3 есть FontLoader.

  13. ruslan January 20th, 2008 20:51

    Спасибо, подгружать действительно можно, но не получается воссоздать свойство антиалиасинга “Bitmap text (no anti-alias)” вля динамически создаваемых полей. Если текст уже лежит на таймлайне он перенимает свойства шрифта и отрисовывается правильно, но если он содан скриптом через createTextField шрифт не воспинимается.

  14. __etc January 21st, 2008 08:43

    А какое имя шрифта вы прописываете? Для битмап текста используется другое имя шрифта.

  15. Forrest Gump April 30th, 2008 15:11

    А на какой версии плеера это работает? Мы столкнулись с тем что на более старых версиях плеера (точно номер не скажу, но один из 9-ых релизов) не грузятся шрифты. Плеер обновили до 9.115 – заработало…

  16. etc April 30th, 2008 15:22

    Ну вообще говоря работало точно с восьмой версии и потенциально должно работать в седьмой.

  17. Forrest Gump May 8th, 2008 19:42

    Вопрос про loadFont – в него пути можно абсолютные писать?

  18. etc May 8th, 2008 21:11

    Можно, но надо учитывать url, указанный в шарной либе.

  19. Forrest Gump May 12th, 2008 07:22

    Есть ли возможность работать со шрифтами без использования Runtime sharing? При запуске флэшки из другого каталога runtime sharing НЕ РАБОТАЕТ (косяк MacroMedia\Adobe) даже при явном указании полных путей. Не будет работать пока в font.swf не прописать полный адрес шарной либы (просто font_shared.swf не работает). Это очень не гибко. Есть ли какое нить решение?

  20. etc May 12th, 2008 07:44

    Перейти на AS3 :)

  21. Forrest Gump May 12th, 2008 08:40

    Спасибо со рекомендацию. А в рамках ас2 можно как то решить этот вопрос\проблему?

  22. etc May 12th, 2008 08:57

    Я не изучал вопрос загрузки шрифтов в AS2 досконально. То, что надо сваливать все в одну папку — не единственный недостаток подобной загрузки.
    Не использовать runtime sharing не получится, на этом весь принцип работы и устроен.

  23. Nico April 18th, 2010 01:27

    Здраствуйте!
    Отличная работа! Думаю, что вы спасли меня и мой проект!
    Но я столкнулся с проблемой:
    Можно ли использовать в FontManager htmlText?

    Привет из Германии;)

  24. etc April 18th, 2010 06:31

    Ну в принципе можете, почему нет :)

  25. Nico April 18th, 2010 11:24

    У меня не получаеться. Как только я заменяю “field.text =” на “field.htmlText =” текст не показываеться :(

  26. Nico April 18th, 2010 19:54

    Работает только в том случае, если я переношу строчку setNewTextFormat после установки текста и меняю на getTextFormat.

    Так не работает:
    field.setNewTextFormat(event.format); // ставим…
    field.embedFonts = true;
    field.html = true;// включаем embed шрифты
    field.htmlText = ‘Hello’; // Пишем текст

    Так работает:
    field.embedFonts = true;
    field.html = true;// включаем embed шрифты
    field.htmlText = ‘Hello’; // Пишем текст
    field.setTextFormat(event.format);

    Но в рабочем случае, цвет заданный html-тагом перезаписываеться.
    Как обойти эту проблему???
    Зарание благодарен!!!

  27. etc April 18th, 2010 20:00

    Лучше в самом HTML написать тег font с заданным шрифтом, размером и цветом для всего текста.

  28. Nico April 18th, 2010 20:09

    Это я тоже пробывал , но у меня почему то не получаеться

    field.embedFonts = true;
    field.html = true;// включаем embed шрифты
    field.htmlText = ‘Vfont font=”‘+event.format.font+’”color=”#FF0000″ size=”20″V’+event.format.font+’V/fontV’; // Пишем текст

    что я делаю не так?

  29. etc April 18th, 2010 20:14

    Может всё-таки name, а не font? :)

  30. Nico April 18th, 2010 20:24

    Мндауж, я уже 2 дня без перерыва над проектом сижу, отсюда и ошибки.. :) но самое обидное что всеравно не работает. Ща пойду повешусь:) :(

    field.embedFonts = true;
    field.html = true;
    field.htmlText = ‘Vfont name=”‘+event.format.font+’” color=”#FF0000″ size=”20″V’+event.format.font+’V/fontV’;

  31. Nico April 22nd, 2010 20:38

    Здраствуйте,
    я до сих пор не смог добиться того, что бы textHtml отображал текст в режиме embedFonts.
    очень прошу подскажите способ… плииииззззззз

  32. Nico April 22nd, 2010 20:39

    htmlText конечно же!

  33. Nico April 23rd, 2010 00:04

    Дико извиняюсь! Нашел в чем было дело! шрифт был выставлен на bold и без -тага текс естественно не появлялся.

    Ещё раз огромнейшее человеческое спасибо² за Fontmanager!!!!

Leave a reply