ActionScript 3
Работа с событиями
Поиск…
замечания
События представляют собой фрагменты данных, которые программа может создавать, обменивать и реагировать. Асинхронный поток событий отправляется по списку отображения флеш-движком в качестве реакции на внешние события, такие как движения мыши или другой отображаемый кадр. Каждый другой поток событий и вся обработка событий являются синхронными, поэтому, если часть кода генерирует событие, все реакции на него обрабатываются до выполнения следующей строки кода, также если есть несколько слушателей события, все из них будет работать до того, как будет обработано следующее событие.
Существует несколько основных событий, связанных с программированием Flash. Event.ENTER_FRAME
генерируется до того, как Flash рисует другой фрейм, он сигнализирует, что весь список отображения Event.ENTER_FRAME
к рисованию и может использоваться как синхронный таймер. MouseEvent.CLICK
и его братья и сестры могут использоваться для получения ввода от пользователя, а TouchEvent.TOUCH_TAP
является аналоговым для сенсорных экранов. KeyboardEvent.KEY_DOWN
и KEY_UP
предоставляют средства для приема пользовательского ввода с клавиатуры, однако их использование в мобильном отделе практически невозможно из-за устройств, не имеющих физической клавиатуры. Наконец, Event.ADDED_TO_STAGE
отправляется после того, как экранный объект получает доступ к этапу и входит в глобальный список отображения, который получает все события, которые могут пузыриться вверх и вниз по списку отображения.
Большинство событий во Flash являются специфичными для компонента. Если вы разрабатываете свой собственный компонент, который будет использовать события Flash, используйте класс flash.events.Event
потомка и его статические свойства String
для создания набора событий вашего компонента.
Пользовательские события с данными о событиях
package
{
import flash.events.Event;
public class CustomEvent extends Event
{
public static const START:String = "START";
public static const STOP:String = "STOP";
public var data:*;
public function CustomEvent(type:String, data:*,
bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
if (data)
this.data = data;
}
}
}
Чтобы отправить настраиваемое событие:
var dataObject:Object = {name: "Example Data"};
dispatchEvent(new CustomEvent(CustomEvent.START, dataObject))
Для прослушивания пользовательских событий:
addEventListener(CustomEvent.STOP, stopHandler);
function stopHandler(event:CustomEvent):void
{
var dataObject:* = event.data;
}
Обработка событий из списка отображения
package {
import flash.events.EventDispatcher;
public class AbstractDispatcher extends EventDispatcher {
public function AbstractDispatcher(target:IEventDispatcher = null) {
super(target);
}
}
}
Чтобы отправить событие на экземпляр:
var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.dispatchEvent(new Event(Event.CHANGE));
Для прослушивания событий в экземпляре:
var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.addEventListener(Event.CHANGE, changeHandler);
function changeHandler(event:Event):void
{
}
Обработка основных событий
Вспышка отправляет Events
для большинства своих объектов. Одним из самых основных событий является ENTER_FRAME
, который отправляется (при частоте кадров SWF) для каждого объекта списка отображения.
import flash.display.Sprite;
import flash.events.Event;
var s:Sprite = new Sprite();
s.addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(e:Event)
{
trace("I am called on every frame !");
}
Эта функция будет вызываться асинхронно на каждом кадре. Это означает, что функция, которую вы назначаете в качестве onEnterFrame
события onEnterFrame
, обрабатывается перед любым другим кодом ActionScript, который привязан к затронутым фреймам.
Добавьте свои собственные события
Вы можете создавать свои собственные события и отправлять их, расширяя класс Event
.
import flash.events.Event;
class MyEvent extends Event
{
var data: String;
static public var MY_EVENT_TYPE = "my_event_my_event_code";
public function MyEvent(type: String, data: String)
{
this.data = data;
}
override public function clone():Event
{
return new MyEvent(type, data);
}
}
Затем вы можете отправить его и прослушать, используя EventDispatcher
. Обратите внимание, что большинство flash-объектов являются диспетчерами событий.
import flash.events.EventDispatcher;
var d = new EventDispatcher();
d.addEventListener(MyEvent.MY_EVENT_TYPE, onType);
function onType(e: MyEvent)
{
trace("I have a string: "+e.data);
}
d.dispatchEvent(new MyEvent(MyEvent.MY_EVENT_TYPE, "Hello events!"));
Обратите внимание, что метод clone
требуется, если вы хотите переадресовать свое событие.
Простая структура событий мыши
Благодаря использованию event types
вы можете легко уменьшить раздувание кода, которое часто возникает при определении событий для многих объектов на сцене, путем фильтрации событий в 1 функции, а не определения многих функций обработки событий.
Представьте, что у нас есть 10 объектов на сцене с именем object1
, object2
... object10
Вы можете сделать следующее:
var i: int = 1;
while(getChildByName("object"+i) != null){
var obj = getChildByName("object"+i)
obj.addEventListener(MouseEvent.CLICK, ObjectMouseEventHandler);
obj.addEventListener(MouseEvent.MOUSE_OVER, ObjectMouseEventHandler);
obj.addEventListener(MouseEvent.MOUSE_OUT, ObjectMouseEventHandler);
obj.alpha = 0.75;
i++;
}
function ObjectMouseEventHandler(evt:Event)
{
if(evt.type == "click")
{
trace(evt.currentTarget + " has been clicked");
}
else
{
evt.currentTarget.alpha = evt.type == "mouseOver" ? 1 : 0.75;
}
}
Преимущества этого метода включают:
- Не нужно указывать количество объектов для применения событий.
- Не нужно было точно знать, с каким объектом было взаимодействовать, но все же применяют функциональность.
- Легкое применение событий навалом.