Как я могу отслеживать раздел текста в динамическом TextField в AS3

Я хочу иметь возможность применять нестандартные атрибуты к разделам текста в TextField. Например, символы 30-45 будут установлены для анимации в определенном направлении.

Поскольку это поле является редактируемым, символы 30-45 могут больше не находиться в 30-45, если текст редактируется каким-либо образом.

Кто-нибудь может придумать элегантный способ отслеживать, к каким персонажам были применены атрибуты?

1 ответ

Решение

У меня был похожий проект, и в итоге я расширил класс TextField в соответствии со своими потребностями. Вот краткое описание того, что делать - мой боевой код является конфиденциальным, я боюсь:

  1. Переопределить сеттеры для text а также htmlText
  2. Разобрать любой контент из этих сеттеров в массив пользовательских объектов. Каждый из этих объектов содержит необработанные текстовые блоки и метаданные, которые к ним применяются (формат, комментарии и т. Д.).

    Например,

    <span class="sometext" animation="true">Info</span> 
    

    будет переведен на объект, как это:

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