分享

生成和处理事件机制

 灵岩侠客 2011-10-16
生成和处理事件机制
在以往的as2当中,基本上只有组件能够发送事件,平时的程序中基本上都是这种类似01.xxx.onLoad=function(){}  的回调函数形式,甚至利用onEnterFrame来模拟不断侦听的效果,而as3中提供的解决方案是DOM3事件处理机制,它包括注册侦听器、发送事件、侦听事件、移除侦听器4个步骤。
这是一个小例子:



下面我根据自己的思路来分析一下这个过程。当我们建立一个对象且让他具有发送事件的能力,就必须让他继承EventDispatcher类。下面的这个Teacher类,有一个teach方法,它会产生一个TeachEvent事件并且利用dispatchEvent将其推送出去。

下载: 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
01.package {   02.import flash.display.Sprite;   03.public class Student extends Sprite{   04.public function Student(){}   05.public function listenTeacher(e:TeachEvent,...arg):void {   06.arg[0].text = e.target.name+"今天讲了"+arg[1];   07.}   08.}   09.}  下面这个是文档类,首先分别建立了Teacher和Student实例,并且注册侦听器让学生来听老师讲课。当我们在输入文本框填入讲课的内容后点击“讲课”按钮,便执行teach方法将讲课内容推送出去。

下载: 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


文章来源: 我要学flash网(www.) 原文地址:http://www./article/as3/201107/02-14479.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多