类似C#中自定义事件需要一个自定义的EventArgs子类一样,AS3也需要开发者自定义一个Event类的子类,这里我们假设一种场景:设计一个Person(人物)类,里面有Age(年龄),Name(姓名),我们希望每当Person类的实例Age(年纪)发生变化时,能触发一些自定义事件,从而调用某些特定的处理方法。
1.先设计Event类的子类AgeChangeEvent
package {
}
这里我们定义了二类事件:年龄变化(AGE_CHANGE)、年龄超出范围(AGE_OUT_OF_RANGE)
2.再来设计Person类
package {
}
注意这里的dispatchEvent处理部分,先定义一个事件(参数)对象,然后派发事件.(类似C#中的委托/事件机制,Person类并不知道最终Peson的使用者将如何处理这二个事件,但只要遵守约定就能正确调用开发者执行的处理方法)
3.测试刚才的事件,新建一个Flash File(ActionScript3.0)的fla文件,在第一帧写入以下测试代码 :
var jimmy:Person = new Person("菩提树下的杨过",30);
trace(jimmy.toString());
jimmy.Age = 31;//现在还没注册任何事件,所以啥也不会触发
//注册事件
jimmy.addEventListener(AgeChangeEvent.AGE_CHANGE,AgeChangeHandler);
function AgeChangeHandler(e:AgeChangeEvent):void{
}
jimmy.Age = 32; //现在改变年龄时,将触发AgeChangeHandler事件
jimmy.Age = 150; //将再次触发AgeChangeHandler事件
//再注册一个事件
jimmy.addEventListener(AgeChangeEvent.AGE_OUT_OF_RANGE,AgeOutOfRangeHandler);
function AgeOutOfRangeHandler(e:AgeChangeEvent):void{
}
jimmy.Age = 149;//将同时触发AGE_CHANGE与AGE_OUT_OF_RANGE事件
建议大家先猜猜结果,动手实践一下,再看下面的输出结果:
“菩提树下的杨过”童鞋一晃今年都已经“30”岁了,真是岁月不饶人啊.
注意:这家伙年龄改了!
注意:这家伙年龄改了!
注意:这家伙年龄改了!
注意:这老家伙居然说自己年龄超过120岁了!
有时候,我们还希望AgeChangeEvent参数还能附带一些额外信息,这个也难不倒AS,把AgeChangeEvent改造一下(注意新增部分):
package {
}
Person类里Age的setter部分也要改一下:
//Age属性的setter方法(在这里加入事件派发处理)
测试fla中的代码稍加改动:
var jimmy:Person = new Person("菩提树下的杨过",30);
trace(jimmy.toString());
jimmy.Age = 31;//现在还没注册任何事件,所以啥也不会触发
//注册事件
jimmy.addEventListener(AgeChangeEvent.AGE_CHANGE,AgeChangeHandler);
function AgeChangeHandler(e:AgeChangeEvent):void{
}
jimmy.Age = 32; //现在改变年龄时,将触发AgeChangeHandler事件
jimmy.Age = 150; //将再次触发AgeChangeHandler事件
//再注册一个事件
jimmy.addEventListener(AgeChangeEvent.AGE_OUT_OF_RANGE,AgeOutOfRangeHandler);
function AgeOutOfRangeHandler(e:AgeChangeEvent):void{
}
jimmy.Age = 149;//将同时触发AGE_CHANGE与AGE_OUT_OF_RANGE事件
新的输出结果:
“菩提树下的杨过”童鞋一晃今年都已经“30”岁了,真是岁月不饶人啊.
注意:这家伙年龄从31改成32了!
注意:这家伙年龄从32改成150了!
注意:这家伙年龄从150改成149了!
注意:这老家伙居然说自己年龄超过120岁,现在已经有149了!
后记:自定义事件可以广泛应用于很多场景,比如我们可以自己做一个控制滑块MovieClip,里面定义一个ValueChange事件,其它需要的地方(比如音量大小控制,对象Alpha
值控制,对象大小控制...),只要定义自己的处理函数,然后注册到该事件即可
源代码:http://files.cnblogs.com/yjmyzz/as3_custom_events.rar
来自:http://www.cnblogs.com/yjmyzz/archive/2010/04/14/1712155.html