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

Метод toString ( ) часто оказывается полезным при отладке, когда необходимо получить быструю, неформатированную информацию об элементах, содержащихся в массиве. Например:

var sites = ["www. moock. org", "www. adobe. com", "www. oreilly. com"]; traceCThe sites array is » + sites);

Стоит отметить, что метод j oin ( ) предоставляет более широкие возможности по форматированию информации, чем toString ( ). Более подробные сведения можно получить в справочнике по языку ActionScript корпорации Adobe.

Многомерные массивы

До сих пор мы рассматривали только одномерные массивы, которые аналогичны одной строке или одному столбцу в электронной таблице. Что же делать в том случае, если мы захотим создать эквивалент электронной таблицы с несколькими строками и столбцами? Нам понадобится второе измерение. Язык ActionScript в прямом виде поддерживает только одномерные массивы, однако мы можем имитировать многомерный массив, создав массивы внутри массивов. Другими словами, мы можем создавать массивы, элементами которых являются другие массивы (иногда называемые вложенными).

Простейшим типом многомерного массива является двумерный массив, элементы которого концептуально организованы в виде сетки со строками и столбцами. Первое измерение массива представляет строки, а второе — столбцы.

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

var rowl:Array = [6. 2.99]; // Количество 6. Цена 2.99 var row2:Array = [4. 9.99]; // Количество 4, Цена 9.99 var row3:Array = [1. 59.99]; // Количество 1. Цена 59.99

Затем мы помещаем созданные строки в массив-контейнер с именем spreadsheet: var spreadsheet:Array = [rowl, row2, row3];

Теперь мы можем найти общую сумму заказа, перемножив значения количества и цены для каждой строки и сложив получившиеся произведения. Для обращения к элементам двумерного массива используются два индекса (один индекс обозначает строку, другой — столбец). Выражение spreadsheet [0], например, представляет первую строку массива, состоящего из двух столбцов. Таким образом, чтобы обратиться ко второму столбцу первой строки массива spreadsheet, мы используем выражение spreadsheet [0] [1] (оно вернет значение 2,99). Общая стоимость товаров, содержащихся в массиве spreadsheet, вычисляется следующим образом:

// Создаем переменную для хранения общей стоимости заказа, var total:Number;

// Теперь определяем стоимость заказа. Для каждой строки перемножаем // значения столбцов, а полученное произведение прибавляем к значению // переменной total.

for (var i:int = 0; i < spreadsheet.length; i++) { total += spreadsheet[i][0] * spreadsheet[i][l];

}

trace(total); // Выводит: 117.89

Переходим к событиям

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

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

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

ГЛАВА 12

События и обработка событий

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

В ActionScript события используются повсеместно. На самом деле в программе, написанной полностью на языке ActionScript, сразу после того, как метод-конструктор основного класса завершает свою работу, выполнение оставшейся части кода инициируется посредством событий. Таким образом, ActionScript поддерживает событийную модель с широкими возможностями, составляющую основу не только для предопределенных, но и для пользовательских событий.

Событийная модель языка ActionScript основана на спецификации W3C Document Object л * Model (DOM) Level 3, доступной по адресу http://www. w3.org/TR/DOM-Level-3-Events.

В этой главе рассматриваются основы событийной модели языка ActionScript, включая обработку предопределенных событий и реализацию пользовательских событий в программе. Стоит отметить, однако, что в этой главе описываются только основы работы с событиями. Позднее, в гл. 21, будет рассказано, каким образом событийная модель языка ActionScript обеспечивает отображение объектов (объектов, представляющих экранное содержимое). Затем в гл. 22 будет описано все многообразие предопределенных событий пользовательского ввода.

Основы обработки событий в ActionScript

Для обработки событий (реакции на события) в программе на языке ActionScript используются приемники событий. Приемник событий — это функция или метод, которые выполняются при возникновении определенного события. Они называются так потому, что, по существу, ожидают возникновения событий (или, иначе говоря, принимают возникающие события). Чтобы сообщить программе, что возникло определенное событие, среда выполнения Flash вызывает все приемники событий, которые были зарегистрированы на получение информации о возникновении этого события. Описанный процесс нотификации называется диспетчеризацией события.

Перед началом диспетчеризации очередного события среда выполнения создает объект, называемый событийным объектом, который представляет данное событие. Событийный объект всегда является экземпляром класса Event или одного из его потомков. Все приемники событий, выполняемые в процессе диспетчеризации события, получают в качестве аргумента событийный объект. Любой приемник может использовать переменные событийного объекта для получения информации, касающейся произошедшего события. Например, приемник события, которое представляет активность мыши, может использовать переменные событийного объекта, чтобы определить положение указателя мыши в момент возникновения события.

Каждому типу событий в языке ActionScript, будь то предопределенные или пользовательские события, присваивается строковое имя. Например, именем события типа «щелчок кнопкой мыши» является «click». В процессе диспетчеризации события имя обрабатываемого события может быть получено через переменную type событийного объекта, передаваемого в каждый приемник.

Каждая диспетчеризация события в языке ActionScript обладает получателем, представляющим объект, которому принадлежит данное событие. Например, для событий ввода получателем события обычно является объект, над которым выполнялись определенные действия (щелкнули кнопкой мыши, ввели информацию, переместили указатель мыши и т. д.). Подобным образом для сетевых событий получателем события обычно является объект, вызвавший сетевую операцию.

Для получения информации о возникновении определенного события приемники обычно регистрируются в получателе события. Соответственно, все объекты получателей событий являются экземплярами класса, унаследованного от класса EventDispatcher или реализующего интерфейс IEventDispatcher. Класс EventDispatcher предоставляет методы для регистрации и отмены регистрации приемников событий (addEventListener ( ) и removeEventListener ( ) соответственно).

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

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

Регистрация приемника события для получения информации о событии

Основной процесс обработки события в ActionScript заключается в выполнении следующих действий.

1. Определить имя типа события.

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

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

4. Теперь следует использовать метод экземпляра addEventListener ( ) класса EventDispatcher, чтобы зарегистрировать приемник события в получателе события (или в любом контейнере отображения получателя события).

5. Откинуться на спинку кресла и ожидать возникновения события.

Рассмотрим описанные шаги на примере: создадим и зарегистрируем приемник для предопределенного события 11 complete».

Шаг 1: Определение имени типа события

Клиентские среды выполнения Flash предлагают широкий выбор типов предопределенных событий, начиная с пользовательского ввода и заканчивая сетевой и звуковой активностью. Имя каждого типа события доступно через константу класса Event или одного из его потомков. Например, константой для типа события «операция завершена» является Event. COMPLETE со строковым значением «complete» . Подобным образом константа для события типа «кнопка мыши нажата» называется MouseEvent. MOUSE DOWN, строковым значением которой является «mouseDown».

Чтобы иметь возможность реагировать на конкретный тип предопределенного события, мы сначала должны найти константу, представляющую это событие. В справочнике по языку ActionScript корпорации Adobe константы событий перечислены в разделе Events для каждого класса, поддерживающего события (то есть унаследованного от класса EventDispatcher). Таким образом, чтобы найти константу для конкретного предопределенного события, мы обращаемся к разделу Events документации по тому классу, которому принадлежит это событие.

Предположим, что мы загружаем внешний текстовый файл с помощью класса URLLoader и хотим выполнить некоторый код по завершению загрузки. Мы обращаемся к разделу Events документации по классу URLLoader, чтобы определить, есть ли у него подходящее нам событие «загрузка завершена». В разделе Events мы находим описание события «complete», которое, кажется, нам подходит. Описание события «complete» выглядит следующим образом.

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

Событие complete

Тип событийного объекта: flash. events. Event Свойство Event, type = flash. events. Event. COMPLETE

Диспетчеризация события осуществляется после того, как все полученные данные декодированы и помещены в свойство data объекта URLLoader. Обращаться к полученным данным можно сразу после диспетчеризации этого события.

Подраздел Свойство Event, type сообщает нам название константы для события «complete» — flash. events. Event. COMPLETE. Мы будем использовать эту константу при регистрации приемника для события «complete», как показано полужирным шрифтом в следующем обобщенном коде: o6beKTilRLLoader. addEventListener (Event. COMPLETE, некийПриемник);

С этого момента при упоминании любых предопределенных событий мы будем использовать соответствующую константу события (например, Event. COMPLETE) вместо его строкового имени-литерала (например, «complete»). Хотя данный стиль является слегка громоздким, он способствует знакомству разработчика с константами событий, фактически применяемых в программах на языке ActionScript.

Шаг 2: Определение типа данных событийного объекта

Теперь, когда мы определили имя типа нашего события (Event. COMPLETE), нужно определить тип данных соответствующего событийного объекта. И снова обращаемся к описанию события «complete» класса URLLoader в справочнике по языку ActionScript корпорации Adobe. Подраздел Свойство Event, type описания события «complete» (которое приводилось в предыдущем разделе) сообщает нам тип данных объекта Event события Event. COMPLETE — flash. events. Event.

Шаг 3: Создание приемника события

Мы знаем константу и тип данных событийного объекта для нашего события (Event. COMPLETE и Event соответственно) и можем создать для него соответствующий приемник. Вот этот код:

private function completeListener (e:Event):void { traceCLoad complete»):

}

Обратите внимание, что в нашем приемнике описан параметр (е), который будет принимать событийный объект на этапе диспетчеризации события. Тип данных параметра соответствует типу данных события Event. COMPLETE, который был определен на шаге 2.

По соглашению, типом возвращаемого значения всех приемников событий является void. Более того, приемники событий — это методы, которые обычно объявляются с использованием модификатора управления доступом private, что исключает возможность их вызова кодом за пределами класса, в котором они определены.

Руководство по 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).



Полезные ссылки
Случайные записи
  • 16.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.33
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.70
  • 02.03.2011">Руководство по actionscript. часть 5, стр. 095
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.11
  • 14.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.61
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 008
  • 22.07.2011">Интернет – кладезь для меломанов
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.33
  • 06.02.2010">Вывод последней записи из твиттера
  • 04.03.2011">Руководство по actionscript. часть 5, стр. 027
  • 16.03.2011">Руководство по actionscript. часть 3, стр. 024
  • 02.03.2011">Руководство по actionscript. часть 5, стр. 091
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.136
  • 15.03.2011">Руководство по actionscript. часть 3, стр. 054
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.132
Опрос

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

View Results

Loading ... Loading ...