Перед прочтением советуется ознакомиться с топиком
[as3] Создание и рассылка своих собственных событий
Бывают случаи когда обработчику события нужно передать определенные параметры, разберем абстрактный случай, например у нас есть класс наслейдующий от Sprite, класс рассылает специально событие changed, которое рассылается при изменении размера, позиции или добавлении дочерних DisplayObject'ов.
Для этого мы создадим собственное событие ( класс наслейдующий flash.events.Event ) с возможностью записи "типа изменения".
Класс события
Код:
package com.onorange.faq.events {
import flash.events.Event;
public class ChangeEvent extends Event{
private var __changeType:String;
//создамим константу, содержащую в себе названия события.
public static const CHANGED:String = "changed";
//Создаем константы содержащие в себе типы изменения
public static const POSITION:String = "position";
public static const SIZE:String = "size";
public static const CHILD:String = "child";
//создаем конструктор
public function ChangeEvent(type:String,changeType:String) {
super(type);
__changeType = changeType;
}
//создаем метод акксесор
public function get changeType():String {
return __changeType;
}
}
}
Теперь создадим класс который будет рассылать данные события
Код:
package com.onorange.faq.display {
import com.onorange.faq.events.ChangeEvent;
import flash.display.Sprite;
import flash.display.DisplayObject;
public class ChangeDispatcher extends Sprite{
public function ChangeDispatcher() {
super();
//больше нам ничего от конструктора не надо
}
//переопределяем методы addChild
public override function addChild(child:DisplayObject):DisplayObject {
//рассылаем наше событие, при создании события задаем дополнительный параметр
dispatchEvent(new ChangeEvent(ChangeEvent.CHANGED,ChangeEvent.CHILD));
return super.addChild(child);
}
//методы для изменения размера и позиции
public function setSize(width:Number,height:Number):void {
this.width = width;
this.height = height;
dispatchEvent(new ChangeEvent(ChangeEvent.CHANGED,ChangeEvent.SIZE));
}
public function setPosition(x:Number,y:Number):void {
this.x = x;
this.y = y;
dispatchEvent(new ChangeEvent(ChangeEvent.CHANGED,ChangeEvent.POSITION));
}
}
}
Ну и собственно проверяем
Код:
package {
import com.onorange.faq.display.ChangeDispatcher;
import com.onorange.faq.events.ChangeEvent;
import flash.display.Sprite;
public class Test extends Sprite {
public function Test() {
var cd:ChangeDispatcher = new ChangeDispatcher();
//подписываем обработчик
cd.addEventListener(ChangeEvent.CHANGED,__handleEvent);
//вызываем наши методы для проверки
cd.setPosition(20,20);
cd.setSize(50,50);
cd.addChild(new Sprite());
}
//со[даем обработчик
private function __handleEvent(evt:ChangeEvent):void {
trace(evt.changeType);
}
}
}