PDA

Просмотр полной версии : [as3] Передача параметров обработчику события


Nirth
20.05.2006, 10:07
Перед прочтением советуется ознакомиться с топиком [as3] Создание и рассылка своих собственных событий (http://flasher.ru/forum/showthread.php?t=79874)

Бывают случаи когда обработчику события нужно передать определенные параметры, разберем абстрактный случай, например у нас есть класс наслейдующий от 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);
}
}
}