Руководство по actionscript. часть 2, стр. 038

Поскольку стандарта по именованию функций и методов приемников событий не существует, для именования приемников событий в этой книге используется формат имяСобытияН stener, где имяСобытия — строковое имя события (в нашем примере «complete»).

Шаг 4: Регистрация приемника для события

Теперь, когда мы определили наш приемник события, можно приступать к его регистрации. Если помните, мы загружаем внешний текстовый файл с помощью экземпляра класса URLLoader. Этот экземпляр будет нашим получателем события (поскольку он инициирует операцию загрузки, которая в конце концов завершится событием Event. COMPLETE). Следующий код создает экземпляр класса URLLoader:

var urlLoader:URLLoader = new URLLoader( );

Следующий код регистрирует наш приемник completeListener ( ) в только что созданном получателе события urlLoader для событий Event. COMPLETE:

urlLoader. addEventListener(Event. COMPLETE, completeListener);

Первый аргумент метода addEventListener ( ) задает имя типа события, для которого выполняется регистрация. Второй аргумент метода addEventListener ( ) является ссылкой на регистрируемый приемник.

Рассмотрим полную сигнатуру метода addEventListener ( ):

addEventListener(тип, приемник, использоватьПерехват, приоритет, использоватьСлабуюСсылку)

Первые два параметра (тип и приемник) являются обязательными; остальные — необязательными. Параметры приор и тети использова ть СлабуюСсылку будут рассмотрены далее в этой главе, а с параметром использоватьПерехват мы познакомимся в гл. 21.

Шаг 5: Ожидание возникновения события

Мы создали приемник для события Event. COMPLETE и зарегистрировали его в получателе события. Чтобы возникло событие Event. COMPLETE, что, в свою очередь, приведет к выполнению метода completeListener ( ), мы инициируем операцию загрузки файла, как показано в следующем коде:

urlLoader.1oad(new URLRequest(«someFi1e. txt»)):

Когда загрузка файла someFile. txt будет завершена, среда Flash приступит к диспетчеризации события Event. COMPLETE, возникшего в объекте ur lLoader, и выполнит метод completeListener ( ).

Руководство по actionscript. часть 2, стр. 039

Листинг 12.1 демонстрирует код, представляющий пять описанных шагов в контексте функционального класса FileLoader:

Листинг 12.1. Регистрация приемника для событий Event. COMPLETE

package { import flash. display.*: import flash. net.*; import flash. events.*;

public class FileLoader extends Sprite { public function FileLoader ( ) { // Создаем получатель события var urlLoader:URLLoader = new URLLoader( ); // Регистрируем приемник события

urlLoader. addEventListener(Event. COMPLETE. completeListener); // Запускаем операцию, которая приведет к возникновению события url Loader.1oad(new URLRequest(«someFi1e. txt»));

}

// Определяем приемник события private function completeListener (e:Event):void { traceC’Load complete»);

}

}

}

Чтобы попрактиковаться, зарегистрируем еще два события.

Два дополнительных примера регистрации приемников событий

В случае если при выполнении кода листинга 12.1 клиентская среда Flash не обнаружит файл someFile. txt, то она приступит к диспетчеризации собы-

тия IOErrorEvent. IO ERROR, получателем которого будет являться объект urlLoader. Зарегистрируем приемник для этого события, чтобы наше приложение могло корректно обрабатывать ошибки загрузки. Сначала мы создадим новый приемник события ioErrorListener ( ), как показано в следующем коде:

private function ioErrorListener (e:Event):void { traceC’Error loading file.»);

}

Теперь зарегистрируем приемник события ioErrorListener ( ) в объекте

urlLoader для событий IOErrorEvent. IO_ERROR:

urlLoader. addEventListener(IOErrorEvent. I0_ERR0R. ioErrorListener);

Красиво и просто.

Руководство по actionscript. часть 2, стр. 040

В листинге 12.2 демонстрируется новый код, который обрабатывает события IOErrorEvent. IO_ERROR, в контексте класса FileLoader.

Листинг 12.2. Регистрация приемника для событий IOErrorEvent. IO_ERROR

package { import flash. display.*; import flash. net.*; import flash. events.*;

public class FileLoader extends Sprite { public function FileLoader ( ) { var url Loader-.URLLoader = new URLLoader( ); urlLoader. addEventLi stener(Event. COMPLETE, completeLi stener); urlLoader. addEventLi stener(IOErrorEvent. I0_ERR0R, i oErrorLi stener); urlLoader.1oad(new URLRequest(«someFi1e. txt»));

}

private function completeListener (e:Event):void { traceC’Load complete»);

}

private function ioErrorListener (e:Event):void { traceC’Error loading file.»);

>

}

}

Теперь попытаемся обработать совершенно другое предопределенное событие Event. RESIZE клиентской среды выполнения Flash. Диспетчеризация события Event. RESIZE осуществляется всякий раз, когда среда выполнения Flash находится в режиме «без масштабирования» (no-scale) и изменяется ширина или высота окна приложения. Получателем событий Event. RESIZE является экземпляр класса Stage клиентской среды Flash. Для обращения к этому экземпляру мы воспользуемся переменной stage нашего основного класса приложения ResizeMonitor. Если вы еще незнакомы с экземпляром класса Stage, пока просто считайте, что он представляет область отображения клиентской среды выполнения Flash. Более подробно класс Stage будет рассмотрен в гл. 20.

Вот этот код:

package { import flash. display.*; import flash. net.*; import flash. events.*;

public class ResizeMonitor extends Sprite { public function ResizeMonitor ( ) { // Используем режим «без масштабирования». В противном случае при // изменении размеров окна приложения происходит автоматическое // масштабирование содержимого и события Event. RESIZE не возникают, stage. sealeMode = StageSca1eMode. N0_SCALE; // Регистрируем resizel_istener( ) в экземпляре Stage на события // Event. RESIZE.

Руководство по actionscript. часть 2, стр. 041

Stage. addEventLi stener(Event. RESIZE, resi zeLi stener);

}

// Определяем приемник события, выполняющийся всякий раз. когда среда // выполнения Flash генерирует событие Event. RESIZE private function resizeListener (e:Event):void {

traceCThe application window changed size!»);

// Вывод новых размеров экземпляра Stage на консоль

// с отладочной информацией

traceCNew width: » + stage. stageWidth);

trace(«New height: » + stage. stageHeight);

}

}

}

Обратите внимание, что внутри функции resizeListener ( ) к переменной stage можно обращаться напрямую, как если бы мы находились в методе-конструкторе класса ResizeMonitor.

«г*

Когда приемником события является метод экземпляра, приемник получает полный доступ к методам и переменным этого экземпляра. Дополнительную информацию можно найти 3# в разд. «Связанные методы» гл. 3.

Руководство по actionscript. часть 2, стр. 042

Отмена регистрации приемника для события

Чтобы остановить процесс получения приемником событий уведомлений о возникающих событиях, мы должны отменить регистрацию этого приемника с помощью метода removeEventListener ( ) экземпляра класса EventDispatcher, который имеет следующий обобщенный вид:

получательСобытияИлиПредокПолучателя. removeEventLi stener (ш7, приемник, использоватьПерехват)

В большинстве случаев обязательными являются только первые два параметра (тип и приемник); параметр использоватьПерехват будет рассмотрен в гл. 21.

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

Следующий код демонстрирует использование метода removeEventLi stener ( ); ом останавливает процесс получения методом mouseMoveListener ( ) уведомлений о возникающих событиях Мои seEvent. MOUSE_MOVE, получателем которых является экземпляр класса Stage:

stage. removeEventLi stener(MouseEvent. M0USE_M0VE, mouseMoveLi stener);

Дополнительную информацию о потенциальных проблемах с памятью, которые могут возникать в процессе использования событий, можно найти в разд. «Приемники событий и управление памятью» далее в этой главе.

Обзор терминологии, используемой при работе с событиями

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

Событие — по существу, нечто произошедшее (некое «асинхронное явление»), например щелчок кнопкой мыши или завершение операции загрузки. Каждое событие обозначается именем события, которое обычно доступно через константу. Константы для предопределенных событий определяются либо в классе Event, либо в одном из его подклассов, который наиболее близко связан с событием.

Событийный объект — объект, представляющий одно конкретное возникновение события. Класс событийного объекта определяет, какая информация о данном событии будет доступна приемникам событий. Все событийные объекты являются экземплярами либо класса Event, либо одного из его подклассов.

Получатель события — объект, которому принадлежит событие. Является целевым объектом для события, для которого осуществляется диспетчеризация, и однозначно определяется каждым типом события. Каждый получатель события (и предок получателя в случае получателей в списке отображения) может регистрировать приемники событий, которые будут уведомляться о возникновении события.

Руководство по actionscript. часть 2, стр. 043

Приемник события — функция или метод, которые регистрируются для получения уведомлений о возникновении события от получателя события (или от предка получателя события).

Диспетчеризация события — отправка уведомления о возникновении события получателю события, который вызывает зарегистрированные приемники. Если получатель находится в списке отображения, диспетчеризация события осуществляется по цепочке, от начала списка до получателя и — в случае всплывающих событий — обратно к началу списка. Более подробную информацию о списке отображения и цепочке диспетчеризации событий можно найти в гл. 21. Диспетчеризация события также называется распространением события.

Забегая вперед, хочется привести еще несколько терминов, с которыми придется столкнуться при дальнейшем рассмотрении вопросов обработки событий. Говорят, что приемники, выполняемые в ответ на событие, вызываются этим событием. Когда вызванный приемник завершает свое выполнение, говорят, что событие обработано. Когда все приемники объекта обработают данное событие, говорят, что сам объект завершил обработку этого события.

Теперь, когда мы познакомились с основами событий и их обработки, более детально рассмотрим несколько конкретных вопросов, касающихся обработки событий.

Обращение к объекту получателя

В процессе диспетчеризации любого события объект Event, передаваемый в каждый приемник события, определяет переменную target, которая содержит ссылку на объект получателя. Таким образом, чтобы обратиться к объекту получателя, мы используем следующий обобщенный код для приемника события, который в процессе отладки просто выводит строковое значение (типа String) получателя события:

public function некийПриемник (е:SomeEvent):void { // Обращение к объекту получателя события trace(e. target):

}

Программы обычно используют переменную экземпляра target класса Event для управления объектом получателя. Например, вспомните код, который мы использовали для реакции на завершение операции загрузки файла (продемонстрированный в листинге 12.1):

package { import flash. display.*; import flash. net.*; import flash. events.*;

public class FileLoader extends Sprite { public function FileLoader ( ) { var urlLoader:URLLoader = new URLLoader( ); urlLoader. addEventLi stener(Event. COMPLETE, completeLi stener); urlLoader. load(new URLRequest(«someFi1e. txt»));

}

private function completeListener (e:Event):void { traceC’Load complete»);

}

}

}

В представленном коде мы могли бы обратиться к объекту urlLoader внутри функции completeListener ( ), чтобы получить содержимое загруженного файла. Рассмотрим код, который мы могли бы использовать (обратите внимание, что для

обеспечения безопасности типов значение переменной target приводится к типу URLLoader — фактическому типу данных объекта получателя):

private function completeListener (e:Event):void { var loadedText:String = URLLoader(e. target).data;

}

После выполнения этого кода значением переменной loadedText станет содержимое загруженного текстового файла (someFile. txt).

Руководство по actionscript. часть 2, стр. 044

В листинге 12.3 продемонстрирован еще один пример обращения к объекту получателя события, но на этот раз объект получателя находится в списке отображения. В этом примере, когда текстовое поле получает фокус ввода, цвет фона этого поля становится красным. Для обращения к объекту TextField метод f ocusInListener ( ) использует переменную экземпляра target класса Event.

*», -

^ I В листинге 12.3 применяется несколько методик, которые мы еще не рассматривали: м?. л * создание текста, установка фокуса ввода на объект, работа со списком отображения и цепочка диспетчеризации событий. Все перечисленные темы будут рассмотрены в части П. Если вы никогда не программировали объекты, отображаемые на экране, пропустите этот пример и вернитесь к нему после прочтения части И.

Листинг 12.3. Обращение к объекту получателя

package { import flash. display.*; import flash. events.*; import flash. text.*;

// Изменяет цвет фона текстового поля на красный,

// когда поле получает фокус ввода

public class HighlightText extends Sprite {

// Конструктор

public function HighlightText ( ) { // Создание объекта Sprite var s:Sprite = new Sprite( ); s. x = 100; s. y = 100;

// Создание объекта TextField

var t:TextField = new TextField( );

t. text = «Click here»;

t. background = true;

t. border = true;

t. autoSize = TextFieldAutoSize. LEFT;

// Помещение объекта TextField в объект Sprite s. addChild(t);

II Добавляем объект Sprite в иерархию отображения данного объекта addChild(s);

// Регистрируем приемник для получения уведомлений об установке // фокуса ввода на любой из потомков объекта Sprite (в данном случае // существует только один потомок: объект TextField. t) s. addEventLi stener(FocusEvent. F0CUS_IN. focusInLi stener);

}

// Приемник выполняется в том случае, когда любой из потомков объекта // Sprite получает фокус ввода

public function focusInListener (е:FocusEvent):void { // Выводит: Target of this event dispatch: [object TextField] traceC’Target of this event dispatch: » + e. target);

// Устанавливает красный цвет для фона текстового поля. Обратите // внимание, что для обеспечения безопасности типов мы приводим // значение переменной Event. target к типу TextField — фактическому // типу данных объекта получателя. TextField(e. target).backgroundColor = OxFFOOOO:

}

}

}

Упражнение: попробуйте добавить к коду листинга 12.3 приемник события FocusEvent. FOCUS_OUT, который меняет цвет фона текстового поля — делает его белым.

Руководство по actionscript. часть 2, стр. 045

Обращение к объекту, зарегистрировавшему приемник

В процессе диспетчеризации любого события объект Event, передаваемый в каждый приемник события, определяет переменную currentTarget, содержащую ссылку на объект, в котором зарегистрирован этот приемник события. Это демонстрирует следующий обобщенный код приемника события; он отображает строковое значение (типа String) объекта, в котором зарегистрирован приемник не-кийПриемник( ):

public function некийПриемник (е:НекоеСобытие):void { // Обращение к объекту, в котором зарегистрирован данный приемник события trace(e. currentTarget);

}

Для событий, получателями которых являются неотображаемые объекты, значение переменной экземпляра currentTarget класса Event всегда равняется значению переменной экземпляра target (поскольку приемники всегда регистрируются в получателе события). Например, вернемся к классу FileLoader из листинга 12.1. Если мы сравним значения переменных е. currentTarget и е. target внутри метода completeListener ( ), то увидим, что обе ссылаются на один и тот же объект:

package { import flash. display.*;

import flash. net.*; import flash. events.*;

public class FileLoader extends Sprite { public function FileLoader ( ) { var urlLoader:URLLoader = new URLLoader( ); urlLoader. addEventLi stener(Event. COMPLETE, completeLi stener); urlLoader.1oad(new URLRequest(«someFi1e. txt»));

}

private function completeListener (e:Event):void { trace(e. currentTarget == e. target): // Отображает: true

}

}

}

Тем не менее, как будет рассказано в гл. 21, для событий, получателями которых являются отображаемые объекты в иерархии отображения, приемники могут регистрироваться как в получателе события, так и в его контейнерах отображения. Для приемников событий, зарегистрированных в контейнере отображения получателя события, переменная currentTarget ссылается на этот контейнер, а переменная target — на объект получателя события.

Руководство по actionscript. часть 2, стр. 046

Предположим, объект Sprite, содержащий объект TextField, зарегистрировал приемник события clickListener ( ) для события MouseEvent. CLICK. Когда пользователь щелкает кнопкой мыши в этом текстовом поле, происходит диспетчеризация события MouseEvent. CLICK, в результате чего вызывается приемник clickListener ( ). Внутри метода clickListener ( ) переменная currentTarget ссылается на объект Sprite, а переменная target — на объект TextField.

Программы обычно используют переменную currentTarget для управления объектом, в котором зарегистрирован приемник. В качестве примера модифицируем функцию f ocusInListener ( ) из листинга 12.3. На этот раз при получении объектом TextField фокуса ввода наш новый код функции focusInListener ( ) будет отображать синий овал вокруг текстового поля. Синий овал рисуется на объекте Sprite, доступ к которому осуществляется через переменную currentTarget.

public function focusInListener (e:FocusEvent):void { // Установить для фона текстового поля красный цвет TextField(e. target).backgroundColor = OxFFOOOO;

// Получить ссылку на объект Sprite

var theSprite:Sprite = Sprite(e. currentTarget);

// Нарисовать эллипс на объекте Sprite theSpri te. graphi cs. begi nFi11(OxOOOOFF): theSprite. graphics. drawEl1ipse(-10. -10. 75. 40):

Отмена стандартного поведения событий

Некоторые события в языке ActionScript обладают побочным эффектом, называемым стандартным поведением. Например, стандартным поведением события TextEvent. TEXT_INPUT является добавление текста в текстовое поле получателя. Подобным образом стандартным поведением события MouseEvent. MOUSE_DOWN, получаемого объектом класса SimpleButton, является отображение картинки, которая представляет нажатое состояние кнопки.

В некоторых случаях события, которые характеризуются стандартным поведением, предоставляют возможность избежать этого поведения программным путем. Такие события называются отменяемыми. Например, отменяемыми являются события TextEvent. TEXT_INPUT, FocusEvent. KEY_FOCUS_CHANGE и FocusEvent. MOUSE_FOCUS_CHANGE.

Чтобы избежать стандартного поведения для отменяемого события, мы вызываем метод 3K3eMR7mpapreventDef ault ( ) класса Event над объектом этого класса, передаваемым во все приемники, зарегистрированные для данного события. Например, в следующем коде мы отменяем стандартное поведение для всех событий TextEvent. TEXT_INPUT, получателем которых является текстовое поле t. Вместо того чтобы позволить программе отображать в текстовом поле текст, вводимый пользователем, мы будем просто добавлять в это поле букву «х».

package { import flash. display.*; import flash. text.*; import flash. events.*;

// Изменить текст, вводимый пользователем, на символ «х» public class InputConverter extends Sprite { private var t:TextField;

public function InputConverter ( ) { // Создаем текстовое поле t = new TextField( ); t. border = true; t. background = true; t. type = TextFieldType. INPUT addChild(t);

// Регистрируем приемник для события TextEvent. TEXT_INPUT t. addEventListener(TextEvent. TEXT_INPUT, textInputListener);

}

// Приемник выполняется при возникновении события TextEvent. TEXT_INPUT private function textInputListener (e:TextEvent):void {

// Показать текст, введенный пользователем

trace(«Attempted text input: » + e. text);

// Исключить отображение введенного текста в текстовом поле e. preventDefault( );

// Добавить в текстовое поле букву «х» вместо введенного // пользователем текста t. appendTextCx»);

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

Руководство по actionscript. часть 2, стр. 047

Чтобы определить, было ли отменено стандартное поведение события, диспетчеризация которого происходит в текущий момент, проверьте возвращаемое значение метода экземпляра isDefault Prevented ( ) класса Event внутри приемника, зарегистрированного для получения уведомлений о возникновении данного события.

Стоит отметить, что, как и предопределенные события, пользовательские события имеют возможность определять стандартное поведение, которое может быть отменено вызовом метода preventDef aul t ( ). Дополнительную информацию вместе с примером кода можно найти в подразд. «Отмена стандартного поведения для пользовательских событий» разд. «Пользовательские события» далее в этой главе.

Еще один пример, демонстрирующий использование метода preventDefault() для события TextEvent. TEXT_INPUT, показан в листинге 22.8 гл. 22.

Приоритет приемника события

По умолчанию, если сразу несколько приемников событий регистрируются в конкретном объекте для получения уведомлений об одном и том же типе событий, они вызываются в том порядке, в котором были зарегистрированы. Например, в следующем коде два приемника событий — completeListenerA ( ) и completeListenerB ( ) — регистрируются в объекте urlLoader для получения уведомлений о событии Event. COMPLETE. При возникновении события Event-COMPLETE приемник completeListenerA ( ) будет выполнен раньше приемника completeListenerB ( ), поскольку completeListenerA ( ) был зарегистрирован раньше completeListenerB ( ).

package { import flash. display.*; import flash. net.*; import flash. events.*;

public class FileLoader extends Sprite { public function FileLoader ( ) { var url Loader-.URLLoader = new URLLoader( ); // Порядок регистрации определяет порядок выполнения urlLoader. addEventLi stener(Event. COMPLETE, completeLi stenerA);

url Loader. addEventLi stener(Event. COMPLETE. completeListenerB); url Loader.1oad(new URLRequest(«someFi1e. txt»)):

}

private function completeListenerA (e:Event):void { traceCListener A: Load complete»);

}

private function completeListenerB (e:Event):void { traceCListener B: Load complete»);

}

}

}

Изменить стандартный порядок вызова приемников событий можно с помощью параметра приоритет метода addEventListener ( ), показанного в следующем обобщенном коде:

addEventLi stener(тия, приемник, использоватьПерехват, приоритет, использоватьСлабуюСсылку)

Параметр приоритет представляет собой целое число, обозначающее порядок, в котором должен вызываться регистрируемый приемник события относительно других приемников, зарегистрированных для того же события в том же объекте. Приемники, зарегистрированные с более высоким значением параметра приоритет, будут вызваны раньше приемников, зарегистрированных с более низким значением. Например, приемник, зарегистрированный со значением 3 параметра приоритет, будет вызван раньше приемника, зарегистрированного со значением 2 параметра приоритет. Если два приемника зарегистрированы с одним и тем же значением параметра приоритет, они будут выполняться в том порядке, в котором были зарегистрированы. Если значение параметра приоритет не указано, принимается значение по умолчанию, равное 0.



Полезные ссылки
Случайные записи
  • 04.03.2011">Руководство по actionscript. часть 5, стр. 034
  • 03.03.2011">Руководство по actionscript. часть 5, стр. 076
  • 16.07.2010">Простые способы улучшить сайт
  • 23.02.2011">Руководство по actionscript. часть 7, стр. 019
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 132
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.66
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.32
  • 15.03.2011">Руководство по actionscript. часть 3, стр. 054
  • 06.04.2010">Инструменты и сервисы для оптимизации графики
  • 04.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.14
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 110
  • 19.07.2010">Тестируем сайт правильно
  • 08.03.2011">Руководство по actionscript. часть 4, стр. 083
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.99
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.54
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...