Опубликован: 07.11.2006 | Уровень: специалист | Доступ: платный
Лекция 3:

Форматирование текста

О прототипах

При добавлении функций или параметров в прототипы объектов, необходимо быть осторожным. Если используется цикл for:in для нумерации параметров и методов объекта, на первый план выйдут новые методы и параметры объекта. В качестве примера рассмотрим следующий код:

_root.createEmptyMovieClip("blah", 1);
blah.myVariable = 20;
for (var i in blah) {
  trace(i+" : "+blah[i]);
}

Протокол выполнения этой процедуры в окне Output отобразит "myVariable : 20". Теперь, если мы добавим функцию в прототип Movieclip, которая так же будет выделена в отдельном инстансе фильма:

MovieClip.prototype.yada = function() {
};
_root.createEmptyMovieClip("blah", 1);
blah.myVariable = 20;
for (var i in blah) {
  trace(i+" : "+blah[i]);
}

протокол будет содержать следующее:

yada : [type Function]
myVariable : 20

Функция yada, которую мы определили для всех фильмов, выводится в инстансе blah. Нет оснований считать это проблемой, особенно когда мы ожидаем данное действие. Однако в определенных ситуациях это может стать проблемой, например, если вы используете еще какой-либо код, повторяющий применение параметров и методов MovieClip, и ожидаете определенного результата.

Чтобы предотвратить эти нежелательные последствия, можно использовать метод AsSetPropFlags. Он официально не поддерживается в ActionScript, поэтому лучше на него все же не надеяться, однако он позволяет "скрыть" любые дополнительные параметры или методы, добавленные в цикле for:in. Вызываем метод AsSetPropFlags, передаем ему имя объекта, параметр которого необходимо скрыть, имя параметра или метода и число 1:

AsSetPropFlags (MovieClip.prototype, "yada", 1);

Итак, если мы теперь поместим этот код в нашу предыдущую программу и выполним ее, метод yada больше не будет отображаться циклом:

MovieClip. prototype. yada = function() {
};
ASSetPropFlags(MovieClip.prototype, "yada", 1);
_root.createEmptyMovieClip("blah", 1);
blah.myVariable = 20;
for (var i in blah) {
  trace (i+" : "+blah[i]);
}

Это лишь один из результатов, который может быть получен с помощью AsSetPropFlags. Также можно защитить параметры от перезаписи и осуществлять многие подобные действия. За более подробной информацией обратитесь к странице http://chattyfig.figleaf.com/flashcoders-wiki/index.php?ASSetPropFlags.

Работа с объектом textFormat

Теперь мы собираемся задействовать объект textFormat на базе полученных до сих пор знаний. Мы упоминали ранее, что объект textFormat можно использовать для изменения форматирования определенных фрагментов текста, и теперь мы сделаем так, чтобы это действие выполнялось посимвольно, а не изменяло весь текст одновременно. Затем мы, используя этот метод, сделаем шаг вперед и создадим функцию, которая выбирает все вхождения определенного слова и отображает их в другом формате, большим размером и другим цветом.

Использование setTextFormat

Начнем с краткого изучения использования setTextFormat как такового. Как уже было упомянуто ранее, объект textFormat содержит все данные форматирования для текстового поля. Даже если мы не укажем объект textFormat для текстового поля, у него есть такой объект по умолчанию, и он может быть вызван с помощью выражения TextField.getTextFormat (). Когда мы прежде работали с textFormat, мы использовали его для применения форматирования ко всему объекту textField. Теперь мы будем использовать его для форматирования определенного фрагмента текстового поля.

  1. Откройте новый фильм и создайте текстовое поле, как в предыдущих примерах.

    В данном текстовом поле установите красный цвет текста и дайте имя инстансу в Property inspector (tf_txt).

  2. Нам нужно выделить определенный фрагмент текста, поэтому сначала необходимо определить этот фрагмент и его форматирование. Добавьте новый слой scripts и в первом кадре введите следующий код.
    this.tf_txt.text = "The eidophor system is 
    a projection television system, 
    i.e. it enables Кenlarged television pictures to be projected 
    on to a screen. 
    An ordinary television picture Кderives its brightness 
    from the fluorescence of 
       a screen bombarded by electrons; 
    with Кthe eidophor system, on the other hand, 
    a very powerful source of light is controlled by 
    Кthe television signal 
       picked up by the receiver." ;
    // create textFormat object
    myForm = new TextFormat() ;
    myForm.color = 0x00000;
    myForm.font = "Verdana";
    myForm.size = 9;
  3. Итак, мы создали объект textFormat с именем myForm. Теперь применим его к текстовому полю. Давайте остановимся на слове "eidophor", первый символ которого стоит на 4 позиции, а последний - на 12-й. Мы передадим эти два значения в качестве аргументов, а также объект myForm, методу setTextFormat. Добавьте следующую строку кода под уже имеющимся кодом.
    // apply textformat to characters 4 to 12
    this.tf_txt.setTextFormat(4, 12, myForm);
  4. Сохраните фильм в файле setTextFormat.fla. При его запуске вы увидите слово "eidophor", выделенное черным цветом. Любые изменения в объекте textFormat будут отображены в тексте. Например, если вы добавите следующее выражение над строкой setTextFormat, наше слово будет выделено черным жирным шрифтом:
    myform.bold = true;

    Полезно знать, что если объект textFormat не имеет определенного свойства при применении к объекту textField, он будет использовать уже присутствующее значение. Проверим это.

  5. Замените весь код textFormat на следующее:
    myForm = new TextFormat ();
    myForm.color = 0x000000;

    Здесь нет никакой информации о шрифте или его размере, однако при применении к текстовому полю используется уже имеющееся форматирование (Verdana, 9 пикселей). При запуске фильма, если вы выберете команду Debug > List Variables, то увидите, что объект myForm содержит большое количество переменных со значением null.


    Когда объект textFormat применяется с использованием textField.setTextFormat, все эти null-значения просто отбрасываются и заменяются уже имеющимися значениями.

  6. Добавьте следующую строку кода. Мы будем использовать метод getTextFormat, чтобы передать textFormat фрагмент текста.
    // retrieve the textFormat for characters 4 to 12 in the text field
    post = this.tf_txt.getTextFormat(4, 12);
  7. Сохраните фильм в файле setTextFormat(post).fla, запустите его и выберите Debug > List Variables, и вы увидите, что все переменные присутствуют в post, даже те, которые мы не устанавливали в myForm.

    Теперь у вас есть представление о том, как использовать setTextFormat, и можно приступить к созданию метода для постепенного изменения textFormat. Мы будем делать это во многом аналогично тому, как поступали с функцией typeID. Мы передадим функции число параметров, включая объект textFormat, точку начала, конечную точку, скорость и интервал. Мы также настроим ее на работу с функцией обратной связи, которую применим во второй части данного примера.

  8. Вызов функции будет выглядеть так. Добавьте эту строку внизу ActionScript, под строками кода myForm.
    this.tf_txt.nooTextFormat (myForm, 4, 11, 1, 30);

    Теперь ваш ActionScript будет выглядеть следующим образом.

    this.tf_txt.text = "The eidophor system...by the receiver.";
    myForm = new TextFormat();
    myForm.color = 0x000000;
    this.tf_txt.nooTextFormat(myForm, 25, 43, 1, 30);
  9. Основное ядро функции вам знакомо, так как вы уже встречались с такой конструкцией. Добавьте следующий ActionScript над имеющимся кодом (мы добавим оставшуюся часть кода для nooTextFormatControl и cleanNooTextFormat одновременно).
    TextField.prototype.nooTextFormat = 
      function(tForm, begin, end, speed, interval, 
    Кobja, func) {
    // store parameters in text field
      this.begin = this.current= begin;
      this.end = end+1;
      this.speed = speed;
      this.end = end;
      this.obja = obja;
      this.func = func;
      this.nooTform = tForm;
    // set interval to call nooTextFormatControl
      this.myNooText = setInterval
      (this, "nooTextFormatControl", interval) ;
    };
    TextField.prototype.nooTextFormatControl = function() {
    };
    TextField.prototype.cleanNooTextFormat = function() {
    };

    Мы делаем то же самое, что и раньше - берем все копии всех аргументов, передаваемых в аргумент, и помещаем их в само текстовое поле. Мы приравниваем this.end к end+1, так как второй аргумент, передаваемый setTextFormat, ссылается на символ после последнего символа, к которому применен другой формат, тогда как передаваемое нами значение ссылается на последний символ, формат которого мы хотим изменить.

    В функции управления nooTextFormatControl мы будем пошагово прибавлять значение переменной this.current и увеличивать строку текста, к которой применяется textFormat. Мы начинаем current со значения begin и продолжаем увеличивать его до тех пор, пока оно не достигнет значения end.

  10. Добавьте следующий выделенный код в nooTextFormatControl.
    TextField.prototype.nooTextFormatControl = function() {
      this.current + = this.speed;
      if (this.current>this.end) {
        this.setTextFormat(this.begin, this.end, this.nooTform);
        this. cleanNooTextFormat () ;
      } else {
        this.setTextFormat(this.begin, this.current, this.nooTform);
      }
    };

    При каждом вызове функции мы добавляем speed к значению переменной current. Если это значение меньше, чем конец области, на которую мы хотим оказать влияние, то мы меняем значение textFormat с begin на current. Если оно является конечной точкой или близко к ней по значению (в случае, если мы с каждым кадром прибавляем к current 3 или 4), то мы применяем формат к тексту с использованием начального и конечного значений, переданных в начале, и вызываем функцию cleanUp.

  11. Последнее, что мы сделаем, это добавим следующий выделенный код в cleanNooTextFormat.
    TextField.prototype.cleanNooTextFormat = function() {
      delete this.current;
      delete this.nooTform;
      delete this.begin;
      delete this.end;
      clearInterval(this.myNooText);
      delete this.myNooText;
      this.obja[this.func] ();
    };
  12. Сохраните новый файл под именем switchTextFormat1.fla. Как и раньше, эта функция удаляет все неиспользуемые переменные или свойства.
Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

объект созданый мной упорно не желает оставлять след(единственное что добился, так это то что шарик резво гоняется за курсором) функция duplicateMovieClip остаётся не активной, т.е. следа от объекта не остаётся, но если я тоже самый код вбиваю в учебный файл всё работает, не могу понять где я ошибаюсь и почему в документе созданном заново, не работает код начиная от функции duplicateMovieClip? 

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989