生成和处理事件机制
在以往的as2当中,基本上只有组件能够发送事件,平时的程序中基本上都是这种类似01.xxx.onLoad=function(){} 的回调函数形式,甚至利用onEnterFrame来模拟不断侦听的效果,而as3中提供的解决方案是DOM3事件处理机制,它包括注册侦听器、发送事件、侦听事件、移除侦听器4个步骤。 这是一个小例子:
下载: Teacher.as 01.//事件发送者类
02.package {
03.import flash.events.EventDispatcher;
04.public class Teacher extends EventDispatcher
{ 05. 06.public var name:String; 07. 08.public function Teacher(nm:String) { 09.name = nm; 10.} 11. 12.public function teach(txt:Object,value:String):void{ 13.var teachevent:TeachEvent = new TeachEvent(); 14.teachevent.lesson = value; 15.txt.text = teachevent; 16.dispatchEvent(teachevent); 17.} 18.} 19.} 那么这个TeachEvent到底是什么呢?其实就是我们自定义的一个事件类,首先这个类要继承Event事件类,Event的构造函数是这样的:Event(type:String, bubbles:Boolean = false, cancelable:Boolean = false) ;再利用public static const建立一个事件类型,因此我们在TeachEvent的构造函数中需要加上这句:super(TEACH_LESSON);他就意味着将事件类型TEACH_LESSON传递给父类Event的构造函数。
然后需要重写toString和clone这两个方法,在重写toString方法的时候需要用到formatToString,对于formatToString官方的解释是:在自定义 Event 类中实现 toString() 方法的实用程序函数。其实说白了将toString的返回结果按自定义的格式覆盖了一遍。之后在重写clone方法时需要注意的一点是为了和实例状态保持一致,不要忘了将自定义的方法写进去。 下载: TeachEvent.as 01.package { 02.import flash.events.Event; 03.public class TeachEvent extends Event { 04. 05.public static const TEACH_LESSON:String = "讲课"; 06.private var _lesson:String; 07. 08.public function TeachEvent() { 09.super(TEACH_LESSON); 10.} 11. 12.public function set lesson(ls:String):void{ 13._lesson = ls; 14.} 15. 16.public function get lesson():String{ 17.return _lesson; 18.} 19. 20.override public function toString():String{ 21.return formatToString("TeachEvent","type","bubbles","cancelable","eventPhase","lesson"); 22.} 23. 24.override public function clone():Event{ 25.var teachEvent:TeachEvent = new TeachEvent(); 26.teachEvent._lesson = _lesson; 27.return teachEvent; 28.} 29.} 30.} 这里我建了一个Student类,比较简单,在侦听方法listenTeacher里面为什么接受的参数是(e:TeachEvent,…arg)后面会讲到。 下载: Student.as 下载: EventExample.as
01.package { 02.import flash.text.TextField; 03.import flash.display.Sprite; 04.import flash.display.MovieClip; 05.import flash.events.MouseEvent; 06.import flash.events.Event; 07.public class EventExample extends Sprite { 08. 09.private var teacher:Teacher; 10.private var student:Student; 11.var Handler:Function; 12.public function EventExample() { 13.teacher = new Teacher("老师"); 14.student = new Student(); 15. 16.//学生在老师那里注册了“讲课”事件的侦听,执行了listenTeacher 17.Handler = JEventDelegate.create(student.listenTeacher,txt3,txt1.text); 18.teacher.addEventListener(TeachEvent.TEACH_LESSON,Handler); 19. 20.txt1.addEventListener(Event.CHANGE,changeHandler); 21.teachBtn.buttonMode = true; 22.teachBtn.addEventListener(MouseEvent.CLICK,click); 23.} 24.private function changeHandler(e:Event){ 25.Handler = JEventDelegate.create(student.listenTeacher,txt3,txt1.text); 26.} 27.private function click(e:MouseEvent):void{ 28.teacher.removeEventListener(TeachEvent.TEACH_LESSON,Handler); 29.teacher.addEventListener(TeachEvent.TEACH_LESSON,Handler); 30.teacher.teach(txt2,txt1.text); 31.} 32.} 33.} ok,大致思路就是这样,这里我要捎带的提一下JEventDelegate类,是一个网友写的,这里我借用一下。它的主要作用就是为了解决给侦听器传参的问题,这就是为什么我前面的侦听器函数要写成Handler = JEventDelegate.create(student.listenTeacher,txt3,txt1.text);这种形式的原因,student.listenTeacher是我们自定义的侦听器函数,后面两个是需要传入的参数。因此在Student类的侦听方法里面需要写成listenTeacher(e:TeachEvent,…arg)。…arg是一个对象,把传入的参数都按顺序保存进来了,我们只要像访问数组一样访问它就可以了。 下载: JEventDelegate.as 01.package { 02.public class JEventDelegate { 03.public function JEventDelegate() { 04.} 05.public static function create(f:Function,...arg):Function { 06.var F:Boolean=false; 07.var _f:Function=function(e:*,..._arg){ 08. _arg=arg 09.if(!F){ 10.F=true 11._arg.unshift(e) 12.} 13.f.apply(null,_arg) 14. }; 15.return _f; 16.} 17.public static function toString():String { 18.return "Class JEventDelegate"; 19.} 20.} 21.} 以上就是我的个人心得,如果有理解不当的地方,欢迎各位visiters批评指正。 下载源文件:EventExample.rar
|
|
来自: 灵岩侠客 > 《flashas3.0》