Опубликован: 07.11.2006 | Доступ: свободный | Студентов: 3400 / 338 | Оценка: 3.94 / 3.71 | Длительность: 37:11:00
Лекция 3:

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

Разделение метода на инициализацию и управление

Сначала отменим переопределение функции controlType при каждом вызове метода typeIn. Вместо этого можно было бы разделить наш метод на два отдельных метода - один для инициализации ввода, а другой для управления им:

TextField.prototype.typeIn = function(texta) {
  this.count = 0;
  this.texta = texta;
  setInterval(this, "controlType", 30);
};
TextField.prototype.controlType = function() {
  this.count++;
  this.text = this.texta.substr(0, this.count);
};

Сохраните этот файл под именем typeWriter003.fla. Он не так компактен, как предыдущий, так как содержит две функции вместо одной, но зато в нем легче разобраться. Однако мы еще не предпринимали никаких действий для остановки функции, поэтому это будет нашим следующим шагом.

Завершение работы функции

Функция, настроенная с помощью setInterval, будет вызываться до тех пор, пока для нее не будет вызыван clearInterval. Когда setInterval вызывается первый раз, он возвращает идентификационный номер, который вы должны использовать следующий раз при обнулении интервала. До сих пор мы не использовали эту возможность, однако теперь настало время этим заняться.

В этом упражнении у нас будет текстовое поле, добавленное вручную.


  1. Чтобы установить интервал, добавим следующий выделенный код:
    TextField.prototype.typeIn = function(texta) {
      this.count = 0;
      this.texta = texta;
      this.myTypeID = setInterval(this, "controlType", 30);
    };
  2. Для обнуления интервала и прекращения вызова функции таймером интервалов добавим следующее выражение:
    clearInterval (this.myTypeID);
  3. Теперь добавим другой метод - typeDone, который будет обнулять вызов функции и затем удалять все временные переменные, которые были использованы:
    TextField. prototype. typeDone = function() {
      delete this.count;
      delete this.texta;
      // clear the interval that calls controlType
      clearInterval(this.myTypeID);
      delete this.myTypeID;
    };
  4. Затем нам нужно добавить вызов этой функции, который будет действовать по достижении переменной count длины texta:
    TextField. prototype. controlType = function() {
      this.count++;
      this.text = this.texta.substr(0, this.count);
      // if we reach the end of the string call typeDone
      if (this.count>=this.texta.length) {
      this.typeDone();
      }
    };
  5. Последним штрихом для ActionScript в этом примере будет текст, который должен отображаться:
    text_str = "When a vibrating...
    // rest of text goes here
    ... or Doppler's principle.";
    this.tf_txt.typeln(text_str);
  6. Сохраните ваш фильм в файле typeWriter004.fla и запустите его. Если вы выберете Debug > List Variables по окончании ввода, то увидите, что не осталось ни одной переменной или в объекте текстового поля вообще ничего не содержится. Вы могли бы добавить trace-выражение в функцию controlType, чтобы знать, когда действие завершается.
Дополнения к эффекту ввода текста

Приведем еще два дополнения для нашего набора функций.

  1. Прежде всего, мы можем добавить дополнительные параметры для вызова функции typeIn, расположенной в последней строке нашего ActionScript. Можно передавать ей количество символов, появляющихся в каждом кадре, а также частоту выполнения setInterval.
    this.tf_txt.typeIn(text_str, 3, 30);

    Итак, в каждом кадре будут добавляться 3 символа, а функция будет вызываться каждые 30 миллисекунд. Теперь нам нужно добавить эти параметры в функцию typeIn.

    TextField.prototype.typeIn = 
     function(texta, typeSpeed, interval) {
      this.count = 0;
     //   store the typeSpeed inside the textField
      this.typeSpeed = typeSpeed;
      this.texta = texta;
      this.myTypeID = setInterval(this, "controlType", interval);
    };
  2. Теперь изменим функцию typeControl, чтобы применить переменную typeSpeed:
    TextField.prototype.controlType   =   function() {
      // increase the amount of text displayed by typeSpeed
      this.count += this.typeSpeed;
      this.text = this.texta.substr(0, this.count);
      if (this.count>=this.texta.length) {
        this.typeDone();
      }
    };
  3. Наконец, удалим дополнительную переменную в функции typeDone:
    TextField.prototype.typeDone = function() {
      delete this.count;
      delete this.texta;
      delete this.typeSpeed;
      clearInterval(this.myTypeID);
      delete this.myTypeID;
    };
  4. Сохраните файл под именем typeWriter005.fla. Мы можем легко изменить работу функции typeIn, просто передав ей различные значения. Можете попробовать:
    this.tf_txt.typeIn(tex, 30, 60);

    или

    this.tf_txt.typeIn(tex, 30, 30);
  5. По существу, нам нужно контролировать действие эффекта ввода текста, не внедряясь в функцию и не изменяя внутреннего кода. Это сделает наш метод намного более гибким и мощным.
Добавление функции обратной связи

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

  1. Добавим новые параметры в функцию typeIn.
    TextField.prototype.typeIn = 
     function(texta, typeSpeed, interval, obja, func) {
      this.obja = obja;
      this.func = func;
      this.count = 0;
      this.typeSpeed = typeSpeed;
      this.texta = texta;
      this.myTypeID = setInterval(this, "controlType", interval);
    };
  2. Итак, здесь мы добавили две новые переменные - obja и func. Нам нужно вызывать их по окончании ввода текста, поэтому мы добавили их в функцию typeDone.
    TextField.prototype.typeDone = function() {
      delete this.count;
      delete this.texta;
      delete this.typeSpeed;
      clearInterval(this.myTypeID);
      delete this.myTypeID;
      // execute callback function
      this.obja[this.func]();
      delete this.obja;
      delete this.func;
    };
  3. Для проверки нам понадобится создать функцию для получения обратного вызова и затем изменить наш исходный вызов. Введите этот код под имеющимися функциями.
    function allDone() {
        trace("type done");
      }
  4. Наконец, нам нужно передать некоторые дополнительные значения функции typeIn. Добавьте следующий выделенный код в последнюю строку ActionScript:
    this.tf_txt.typeIn (text_str, 1, 30, _root, "allDone");
  5. 5. Сохраните фильм в файле typeWriter006.fla. При выполнении фильма в окне Output появятся слова type done, так как по окончании ввода была вызвана функция allDone.

Игорь Хан
Игорь Хан

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

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

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

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