Как я могу отслеживать раздел текста в динамическом TextField в AS3
Я хочу иметь возможность применять нестандартные атрибуты к разделам текста в TextField. Например, символы 30-45 будут установлены для анимации в определенном направлении.
Поскольку это поле является редактируемым, символы 30-45 могут больше не находиться в 30-45, если текст редактируется каким-либо образом.
Кто-нибудь может придумать элегантный способ отслеживать, к каким персонажам были применены атрибуты?
1 ответ
У меня был похожий проект, и в итоге я расширил класс TextField в соответствии со своими потребностями. Вот краткое описание того, что делать - мой боевой код является конфиденциальным, я боюсь:
- Переопределить сеттеры для
text
а такжеhtmlText
Разобрать любой контент из этих сеттеров в массив пользовательских объектов. Каждый из этих объектов содержит необработанные текстовые блоки и метаданные, которые к ним применяются (формат, комментарии и т. Д.).
Например,
<span class="sometext" animation="true">Info</span>
будет переведен на объект, как это:
{ text:"Info", clazz="sometext", animation:true };
- Фактический вывод текста затем отображается с помощью
appendText
добавить кусок к фрагменту необработанного текста и используяsetTextFormat
применять форматирование (или делать все остальное, что необходимо) после каждого шага добавления. - Добавьте прослушиватели событий, чтобы реагировать на события TEXT_INPUT и / или KEY_DOWN/KEY_UP, чтобы перехватить любой новый пользовательский ввод. (Вы будете заменять все текстовое содержимое вашего TextField снова и снова, поэтому его нельзя использовать
super.text
.) - Пользовательский ввод обрабатывается с помощью
selectionBeginIndex
а такжеselectionEndIndex
(посчитайте количество символов в необработанном тексте вашего массива объектов, чтобы выяснить, какие куски затронуты). Добавьте или замените новый текст непосредственно внутри объектов-контейнеров, затем используйте шаг 3., чтобы обновить весь текст в TextField. - Я также добавил метод, который уменьшает массив до его рендеринга (т.е. объединяет смежные фрагменты с идентичными метаданными). Это сохраняет массив и помогает создавать XML-выходные данные, которые не имеют сложной древовидной структуры (одномерный - это то, что нам нравится для такого сценария).
- Переопределить геттеры для
text
а такжеhtmlText
вернуть заново отформатированную информацию, если вам нужны результаты где-то еще. Я использовалhtmlText
вернуть полностью оформленную строку XML и сохранитьtext
для доступа к необработанному текстовому контенту, как в обычном TextField.