Март 2011

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

If (е. target == textField) { // …то удаляем его

removeChild(textField); textField = null:

}

}

// Эта функция выполняется, когда пользователь щелкает кнопкой мыши // на объекте TextField

private function textFieldClickListener (e:MouseEvent):void { // На данный момент метод stageClickl_istener( ) // уже удалил объект TextField, // однако приемник все равно вызывается. trace(«textFi eldClickLi stener triggered»);

}

}

}

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

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

Например, рассмотрим процесс диспетчеризации события MouseEvent. CLICK, получателем которого является объект Sprite, содержащийся в экземпляре класса Stage. Цепочка диспетчеризации события включает в себя три уведомления о возникновении события, как показано ниже:

ФАЗА ЗАХВАТА: (1) Объект Stage уведомлен ФАЗА ПОЛУЧЕНИЯ: (2) Объект Sprite уведомлен ФАЗА ВСПЛЫТИЯ: (3) Объект Stage уведомлен

Предположим, что на этапе первого уведомления (1) код в приемнике объекта Stage регистрирует новый приемник для события MouseEvent. CLICK в объекте Sprite. Поскольку событие еще не было передано в объект Sprite, новый приемник будет вызван на этапе второго уведомления (2).

Теперь предположим, что на этапе первого уведомления (1) код в приемнике объекта Stage регистрирует новый приемник для события MouseEvent. CLICK в экземпляре класса Stage, который будет вызываться в фазе всплытия. Поскольку этап первого уведомления (1) уже начался, список приемников экземпляра класса Stage уже заморожен, поэтому новый приемник не будет вызван на этапе первого уведомления (1). Тем не менее новый приемник появится в цепочке диспетчеризации события и будет вызван на этапе третьего уведомления (3).

Наконец, предположим, что на этапе второго уведомления (2) код в приемнике объекта Sprite отменяет регистрацию существующего приемника для события MouseEvent. CLICK в объекте Sprite. Поскольку этап второго уведомле-

ния (2) уже начался, его список приемников был заморожен, поэтому удаленный приемник будет все равно вызван на этапе второго уведомления. Конечно, когда возникнет другое событие MouseEvent. CLICK, удаленный приемник не будет вызываться.

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

Пользовательские события

и цепочка диспетчеризации события

Иерархическая событийная система языка ActionScript применяется ко всем событиям, получателями которых являются отображаемые объекты, — даже к тем событиям, которые генерируются вручную программистом. Когда получателем пользовательского события является объект в иерархии отображения, предки этого объекта получат уведомление о возникновении данного события.

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

Обобщенный код, показанный в листинге 21.5, демонстрирует, как пользовательские события, аналогично внутренним событиям, передаются по цепочке диспетчеризации события. В этом листинге тестовый класс CustomEventDemo говорит среде Flash выполнить диспетчеризацию пользовательского события, получателем которого является объект Sprite в списке отображения.

Листинг 21.5. Пользовательское событие, передаваемое по цепочке диспетчеризации

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

public class CustomEventDemo extends Sprite { public static const SOMEJVENT: String = «SOMEJVENT»;

public function CustomEventDemo ( ) { var sprite:Sprite = new Sprite( ); addChild(sprite);

// Регистрируем приемник someEventListener( ) в экземпляре класса Stage // для уведомлений о возникновении события CustomEventDemo. SOME_EVENT. stage. addEventListener(CustomEventDemo. SOME_EVENT. someEventListener);

// Осуществляем диспетчеризацию события CustomEventDemo. SOME_EVENT,

// получателем которого является объект в списке отображения.

// Второй параметр конструктора класса Event устанавливаем в значение

// true, чтобы у события появилась фаза всплытия.

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

Sprite. dispatchEvent(new Event(CustomEventDemo. SOME_EVENT, true));

private function someEventListener (e:Event):void { trace(«SOMEJVENT occurred.»);

}

}

}

В результате вызова метода dispatchEvent ( ) из листинга 21.5 среда выполнения Flash осуществит диспетчеризацию события Cus tomEventDemo. SOME_EVENT, получателем которого является объект sprite, через цепочку диспетчеризации события.

Цепочка выглядит следующим образом:

Экземпляр класса Stage I

|-> Объект CustomEventDemo I

|-> Объект Sprite

В фазе захвата событие CustomEventDemo. SOME_EVENT проходит от экземпляра класса Stage до объекта CustomEventDemo. В фазе получения событие переходит к объекту Sprite. Наконец, в фазе всплытия событие снова переходит к объекту CustomEventDemo и затем вновь к экземпляру класса Stage. Когда экземпляр класса Stage в фазе всплытия получает уведомление о возникновении события, вызывается функция someEventLis tener ( ). Несмотря на то что событие CustomEventDemo. SOME_EVENT является пользовательским, оно все равно передается по цепочке диспетчеризации события.

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

Как и в случае с внутренними событиями, иерархическая событийная архитектура языка ActionScript позволяет централизовать код, реагирующий на пользовательские события. Предположим, что мы создаем интернет-систему подачи заказов с элементом управления «корзина», который содержит значки выбранных продуктов. Элемент управления «корзина» представляется экземпляром пользовательского класса ShoppingBasket. Подобным образом значок каждого продукта представляется экземпляром пользовательского класса Product. Экземпляры этого класса являются отображаемыми детьми экземпляра класса ShoppingBasket. Экземпляр класса ShoppingBasket имеет строку заголовка, которая выводит название выбранного на настоящий момент продукта.

Когда пользователь выбирает значок продукта в элементе управления «корзина», приложение осуществляет диспетчеризацию пользовательского события Product. PRODUCT SELECTED, получателем которого является соответствующий экземпляр класса Product. Поскольку экземпляр класса ShoppingBasket является предком всех экземпляров класса Product, он получает уведомления всякий раз, когда возникает событие Product. PRODUCT_SELECTED.

Таким образом, чтобы синхронизировать текст строки заголовка экземпляра ShoppingBasket с выбранным в настоящий момент продуктом, мы просто регистрируем единственный приемник productSelectedListener ( ) для события Product. PRODUCT_SELECTED в экземпляре класса ShoppingBasket. Когда вызывается метод productSelectedListener ( ), мы знаем, что был выбран продукт, поэтому заменяем текст строки заголовка корзины названием нового выбранного продукта.

В листингах 21.6 и 21.7 показаны классы ShoppingBasket и Product. Пояснения к коду представлены в виде комментариев. Части кода, относящиеся к событиям, выделены полужирным шрифтом.

Листинг 21.6. Класс ShoppingBasket

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

// Интернет-корзина, которая может визуально содержать объекты Product, public class ShoppingBasket extends Sprite {

// Отображаемая на экране строка заголовка панели «корзина»

private var title:TextField;

// Массив товаров в этой корзине

private var products:Array;

// Выбранный в настоящий момент продукт

private var selectedProduct:Product;

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

public function ShoppingBasket ( ) { // Создаем новый пустой массив для хранения объектов — Product products = new Array( );

// Создаем отображаемую на экране строку заголовка

title = new TextField( );

title. text = «No product selected»;

title. autoSize = TextFieldAutoSize. LEFT;

title. border = true;

title. background = true;

title. selectable = false;

addChild(title);

// Регистрируем приемник для событий Product. PRODUCT_SELECTED, // получателями которых являются дочерние объекты Product. addEventLi stener(Product. PRODUCT_SELECTED, productSelectedLi stener);

}

// Добавляет новый объект Product в корзину public function addProduct (product:Product):void {

// Создаем новый продукт и добавляем его в массив products

products. push(product);

// Добавляем новый продукт в иерархию отображения данного объекта addChiId(products[products. length-1]);

// Теперь, когда у нас появился новый продукт, изменяем // положение всех продуктов updateLayout( );

}

// Очень простой алгоритм размещения продуктов, // упорядочивающий все продукты в одну строку

// в том порядке, в котором они были добавлены // в корзину, слева направо public function updateLayout ( ):void { var totalX:Number = 0;

for (var i:int = 0; i < products.length; i++) { products[i].x = total x;

totalX += products[i] .width + 20; // 20 — интервал между колонками products[i].у = title. height + 20; // 20 — интервал между строками

}

}

// Реагирует на возникновение событий Product. PRODUCT_SELECTED, // получателями которых являются дочерние объекты Product. // Когда продукт выбран, этот метод обновляет // строку заголовка корзины, используя // название выбранного продукта.

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

Private function productSelectedListener (e:Event):void { // Запоминаем выбранный продукт на тот случай, // если нам в дальнейшем потребуется // обратиться к нему selectedProduct = Product(е. target);

// Обновляем строку заголовка корзины title. text — selectedProduct. getName( );

}

}

}

Листинг 21.7. Класс Product

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

// Значок продукта, который может быть помещен в объект ShoppingBasket

// с помощью метода ShoppingBasket. addProduct( ).

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

// В этой упрощенной версии класса значок — просто текстовое поле

// без соответствующего графического значка.

public class Product extends Sprite {

// Событийная константа для пользовательского события PRODUCT_SELECTED

public static const PRODUCT_SELECTED:String = «PRODUCT_SELECTED»;

// Отображаемая на экране надпись, представляющая название продукта

private var label:TextField;

// Название продукта

private var productName:String;

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

public function Product (productName:String) { // Сохраняем название продукта this. productName = productName; // Создаем отображаемую на экране надпись label = new TextField( );

label. text = productName;

label. autoSize = TextFieldAutoSize. LEFT;

label. border = true;

label. background = true;

label. selectable = false:

addChild(label);

// Регистрируем приемник для событий щелчка кнопкой мыши. // Регистрируя приемник для событий MouseEvent. CLICK в этом объекте, // мы будем получать уведомление о возникновении события всякий раз, // когда пользователь щелкает кнопкой мыши на его дочерних объектах // (например, на надписи).

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

AddEventListener(MouseEvent. CLICK, clickListener);

}

// Возвращает название продукта public function getName ( ):String { return productName;

}

// Обрабатывает события MouseEvent. CLICK. В этом примере, чтобы выбрать // продукт и осуществить диспетчеризацию события // Product. PRODUCT_SELECTED, достаточно просто щелкнуть кнопкой мыши // на названии продукта. В более сложной реализации могут учитываться // другие факторы. Например, можно добавить возможность выбора // продуктов с помощью клавиатуры, а на время трансакции с сервером // отключать возможность выбора продуктов, private function clickListener (е:MouseEvent):void { // Уведомляем всех зарегистрированных приемников о том, что был выбран // данный продукт. Благодаря системе иерархической диспетчеризации // событий языка ActionScript, в процессе диспетчеризации // пользовательского события, получателем которого является данный // объект, вызываются не только приемники события // Product. PRODUCT_SELECTED данного объекта, но и приемники события // Product. PRODUCT_SELECTED, зарегистрированные в экземпляре класса // ShoppingBasket.

dispatchEvent(new Еvent(Product. PRODUCT_SELECTED, true));

}

}

}

В листинге 21.8 представлено очень простое приложение, демонстрирующее основы использования классов ShoppingBasket и Product из листингов 21.6 и 21.7.

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

Листинг 21.8. Демонстрация использования класса ShoppingDemo

package { import flash. display. Sprite:

public class ShoppingBasketDemo extends Sprite { public function ShoppingBasketDemo ( ) { var basket:ShoppingBasket = new ShoppingBasket( ): basket. addProduct(new Product(«Nintendo Wii»)); basket. addProduct(new Product(«Xbox 360″));

basket. addProduct(new Product(«PlayStation 3″)); addChild(basket);

}

}

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

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

ПИВА 22

Интерактивность

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

? мыши;

? фокуса;

? клавиатуры;

? текстовыми событиями;

? уровня приложения Flash Player.

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

Для каждой из перечисленных категорий мы рассмотрим конкретные события, предлагаемые интерфейсом API приложения Flash Player, и код, необходимый для обработки этих событий.

Представленные в этой главе описания событий относятся к приложению Flash Player (к версии, реализованной в виде модуля расширения браузера, и к автономной версии), но в целом данная информация применима и к любой другой среде, поддерживающей ввод данных с помощью мыши и клавиатуры (например, приложение Adobe AIR). Если вы используете другие среды выполнения, обязательно просмотрите соответствующую документацию по событиям ввода. Официальную справочную информацию, относящуюся к событиям ввода приложения Flash Player, можно найти в разделе Constants описания класса Event и его подклассов в справочнике по языку ActionScript корпорации Adobe. Полезная информация также находится в разделе Events описания классов TextField, DisplayObject, InteractiveObject и Stage.

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

Только экземпляры класса InteractiveObject. Уведомления о возникновении событий ввода отправляются экземплярам только тех классов, которые наследуются от класса InteractiveObject (Sprite, TextField, Stage, Loader, MovieClip, SimpleButton и подклассов этих классов). Объекты других типов не получают уведомления о возникновении событий ввода, даже если эти объекты находятся в списке отображения. Например, экземпляры класса Shape могут помещаться в список отображения, однако класс Shape не наследуется от класса InteractiveObject, поэтому экземпляры класса Shape не получают уведомления о возникновении событий ввода. Если объект Shape визуально перекрывает объект TextField и пользователь щелкает кнопкой мыши на объекте Shape, получателем результирующего события щелчка будет являться не Shape,

a TextField. Чтобы организовать взаимодействие с объектом Shape или объектом Bitmap, поместите его в контейнер (Sprite или MovieClip) и зарегистрируйте приемник в этом контейнере для событий ввода.

Только объекты из списка отображения. Объекты, не находящиеся в списке отображения на момент диспетчеризации приложением Flash Player некоторого события ввода, не смогут получить уведомление о возникновении этого события.

Поведение по умолчанию. Некоторые события ввода вызывают стандартную реакцию приложения Flash Player, называемую поведением по умолчанию. Например, перемещение указателя мыши над экземпляром класса SimpleButton приводит к тому, что этот экземпляр отображает графическое изображение, связанное с состоянием «над» (когда указатель мыши находится над данным экземпляром). В некоторых случаях поведение по умолчанию приложения Flash Player может быть отменено путем вызова метода экземпляра preventDefault ( ) класса Event. Дополнительную информацию можно найти в разд. «Отмена стандартного поведения событий» гл. 12.

Теперь переходим непосредственно к событиям!

События мыши

Приложение Flash Player выполняет диспетчеризацию событий мыши, когда пользователь производит манипуляции с системным указательным устройством. К указательным устройствам, которые могут генерировать события мыши, относятся: мышь, трекбол, сенсорный планшет ноутбука, джойстик ноутбука и перо. Тем не менее для удобства в этой книге используется всеобъемлющий термин «мышь», подразумевающий системное указательное устройство. События мыши могут возникать в результате следующих типов манипуляций:

? нажатие или отпускание левой кнопки мыши;

? перемещение указателя;

? использование колесика прокрутки мыши (например, вращение).



Полезные ссылки
Случайные записи
  • 04.03.2011">Руководство по actionscript. часть 5, стр. 050
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.43
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 118
  • 28.02.2010">Где найти и скачать иконки?
  • 12.03.2011">Руководство по actionscript. часть 3, стр. 134
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.27
  • 07.10.2010">Подбор цветовой палитры с помощью Color Scheme Designer
  • 22.03.2011">Руководство по actionscript. часть 2, стр. 028
  • 24.11.2012">Как я покупал авиабилеты на 711.ua
  • 02.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.101
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 097
  • 09.03.2011">Руководство по actionscript. часть 4, стр. 059
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.88
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 119
  • 16.03.2011">Руководство по actionscript. часть 3, стр. 020
Опрос

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

View Results

Loading ... Loading ...