Опубликован: 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. Как и раньше, эта функция удаляет все неиспользуемые переменные или свойства.
Игорь Хан
Игорь Хан
След не остается
Александр Коргапольцев
Александр Коргапольцев
Вопрос по содержанию лекции №2, курс Flash MX Studio
Евгения Новоселецкая
Евгения Новоселецкая
Россия
Станислав Бакулин
Станислав Бакулин
Эстония, Нарва