Как я могу отслеживать раздел текста в динамическом TextField в AS3 - PullRequest
1 голос
/ 20 января 2012

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

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

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

1 Ответ

3 голосов
/ 20 января 2012

У меня был похожий проект, и в итоге я расширил класс 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.
...