flash事件模型核心:监听器和广播器 |
| 作者:佚名 来源:闪吧 作者: AOL 更新:2007-1-13 21:01:35 错误报告 我要投稿 |
这对一些想深入了解flash MX运行机制,想进步的AS爱好者来说是非常重要的。 我在各个flash网站上搜寻了一下,有两篇比较好的文章,我先翻译其中的一篇给大家作为参考。I sorry that I am shit in English. Listeners(监听器)和ASBroadcaster(AS广播器) Author: Santiago Esperanza translater: AOL 版本:Flash MX 级别:中级 来源:www.flashguru.co.uk 介绍 用监听的方法是在flash MX中才出现的概念。监听器顾名思义, 就是一个用来监听特定事件的发生情况的对象。如果你对actionscript非常熟悉的话,你肯定多次用到过监听器,但是你可能不知道它们。从技术上说,从flash 5以来所有的影片剪辑,都是监听器;所有的按钮也都是如此。这些flash对象都是用来监听一个事件, 当这个事件发生了,它就执行一段语句。但是在flash MX以前, 它们是怎么样的呢?这个东西也不是什么新事物了, 只是直到flash 版本为MX的时候actionscript语言才让我们完全地运用监听器而已。 进一步的认识 学习监听器, 从按钮开始是一个不错的方法。按钮给我们的整个概念就是非常具有代表性的交互功能。当你按下一个按钮的时候,一个你所期待的结果就会发生。确定这些事情是不是发生了, 这是按钮为达到与用户交互的工作。当按下一个按钮的事件被检测到或者这个事件是由flash播放器发送出去的,在按钮上的on(press)事件和里面的代码就会执行。还有一些按钮监听的事件, 比如说释放(release),滑上(rollOver),等等。而flash的影片剪辑也有类似的为一些事件如enterFrame,mouseMove,keyDown等探测的监听器。 在flash MX以前, 这些监听器(按钮和影片剪辑)都是预先定义好了的,而且它们是不能改变的,我们用户是没有人能够定义别的类型的监听器的。所有的这些都在flash运用新的事件模型后彻底改变了。按钮和影片剪辑仍然是预先定义好了的,但是现在你可以定义你自己的为某些你特指的事件的监听器,就像被公认了的按钮和影片剪辑一样的事件监听器。当然你所定义的监听器不仅仅可以对像keyDown或者mouseMove这样的事件进行监听。你可以用ASBroadcaster(Action script广播器)来定义你要监听的事件。 flash内建的监听事件类型和广播器是怎么样的呢,请看下表。
 你会注意到不是所有的事件, 比如说 onDragOut,都和一件广播器有关联。你可以想象它们是被flash播放器广播的, 而不是通过一个具体的flash actionscript对象。这些事件被限定只能用于列表中对应的监听器。用onDragout来说,它只能用于按钮或者影片剪辑对象。当一件事情被初始化的时候,你就可以广播器添加上面的列表中所允许的监听器。例如, 你可以用actionscript建立一个普通的对象,然后使他监听一个鼠标对象(广播器)。这个鼠标对象可以在当鼠标被按下,移动或者释放的时候让物体执行onMouseDown,onMouseMove和onMouseUp代码。 认识监听器和广播器有两种不同的方法。其中一种方法,表面上在我们的认识当中,独立的监听器是可以意识到的,它们监听事件是否在flash中发生。为了真正了解它们是怎么工作的,我们运用第二种方法,使我们知道监听器和广播器在flash内部是怎么工作的。 监听器监听 我第一次运用到监听器是在MX的影片剪辑运用一个onKeyUp事件。如果在一个影片剪辑自身加了一个onClipEvent(keyUp),这个keyUp事件是被认可的,我加入里面的代码也就会执行了。试着用这种方法来定义事件:instance_mc.onKeyUp = function(){...},没有产生什么结果。直到后面我才意识到我没有把这个影片剪辑定义成Key对象(事件广播器)的一个监听者(器)。只有定义了之后, 它才可以探测到键盘上的一个键是否被按下,然后在被释放的时候,执行这个事件。所以我们可以这样写(直接在时间轴上写,而不是在影片剪辑上写):
Key.addListener(instance_mc); instance_mc.onKeyUp= function(){ // key up code } 为什么一个影片剪辑不会在用onClipEvent的时候一样,自动地成为Key对象的一个监听器呢?老实地说,我也不太清楚,我很懒,没有去研究,这也不是这篇文章的目的。一个影片剪辑被默认注册为Mouse对象的监听器,而不是Key对象,这样的话 instance_mc.onMouseUp=function(){...}就可以工作。(虽然这个概念不完全正确,因为影片剪辑监听的事件也不是被Mouse对象广播,而是flash播放器自身广播的,但是你可以这样理解) 尽管如此, 不管什么对象,就像我的影片剪辑对象一样,可以成为一个广播器的监听者。它可以识别一个广播器所广播的事件而产生对应的动作。从上表中我们可以看到flash自定义的广播器有以下几种:
Key Selection Mouse Stage TextField
其中的每一个对象都可以用addListener()方法来给它们添加监听器,使得监听器可以明白它广播的事件。用Selection对象做例子, 有一个onSetFocus事件。这个事件是在flash中焦点变化的时候发生。当一个对象被添加到Selection对象中, 做为它的一个监听器(它可以是任何对象,普通对象,一个影片剪辑或者一个按钮对象),这时这个对象就可以明白在任何时刻Selection对象广播的事件,可以执行onSetFocus函数所分配给它的任何动作。
例1. 让我们来建立一个对象, 使这个对象成为Mouse对象的监听器。这是我上面所说的第一种认识方法的练习,从表面上来认识监听器是怎么工作的。一个监听器是一个用来监听一件事情发生的对象,事件发生了, 它就执行事件中所定义的代码。
aBigEar = new Object(); // 建立一个普通对象
// 定义执行一个任务的函数 Flicked = function(){ trace("Ouch, you just flicked me!"); }
//使得aBigEar成为Mouse对象事件的监听器 Mouse.addListener(aBigEar);
// 分配一个onMouseDown事件给aBigEar //当aBigEar是Mouse对象的一个监听者 //它就可以像一个影片剪辑那样识别Mouse事件 aBigEar.onMouseDown = Flicked; 你可以把这段代码加入影片当中然后运行。 当你按下鼠标的时候,output窗口就会显示“Ouch, you just flicked me!” 。aBigEar,做为Mouse对象的监听器,当鼠标按下的时候,onMouseDwon所分配给它的函数就会执行,在这里,Flicked函数就会执行, 它包含的一个trace消息也就会显示出来了。 onMouseDown自身,对aBigEar对象来说,仅仅是一个普通的函数。它除了会在flash action编辑器中彩色显示显示之外并没有什么特别的。你可以用aBigEar.onMouseDown()函数轻松地调用这个函数。Mouse 对象,有onMouseDown事件来关联它。因此,当aBigEar被定义为Mouse对象的一个监听器的时候,触发了onMouseDown事件,它就能识别出来,并运行自己定义的onMouseDown函数(在这里就是Flicked函数),这样就可以让你让监听器调用任何你定义的函数。 AS广播器(ASBroadcaster) 我们将拓展监听器的用途,但不是对ASBroadcaster浅尝辄止,而是研究它是怎么实现的。这个对象和监听器对象有非常密切的关系,甚至比你想像的还要密切。每一个上表列出的事件广播器(Key,Mouse,Selection,Stage,TextField)都使用ASBroadcaster在flash场景后面预先定义好了。ASBroadcster使得这些对象可以广播监听器所监听的事件。 ASBroadcaster对象, 不要去把它想得很神秘,其实就是一个普通的有一个初始化方法的类。为了实现广播,它加了三个新的方法和一个新的属性,这样变成了一个新的类。这些方法是:addListener,removeListener,broadcastMessage。还有一个属性是:_listeners. 使用addListener方法可以让你广播器添加个新的监听器。removeListener可以让你除去一个。broadcastMessage是一个产生用来发送到监听器的事件(像onMouseDown)的命令。而_listeners是一个关联到这个广播器的所有监听器的列表。因此, 我们使用ASBroadcaster有下列的方法:
ASBroadcaster.initialize(objToBroadcast); objToBroadcast.addListener(listenObj); objToBroadcast.removeListener(listenObj); objToBroadcast.broadcastMessage("event"); objToBroadcast._listeners; 中文参考如下,flash中可以用中文变量名和函数名。 ASBroadcaster.initialize(广播器); 广播器.addListener(监听器); 广播器.removeListener(监听器); 广播器.broadcastMessage("事件"); 广播器._listeners;
注意到你没有像使用其它的对象一样,用new关键字为ASBroadcaster对象建立一个实例。初始化函数是一个简单的对象容器, 你可以把它看成一个独立的函数。只有当一个对象被初始化为另一个对象的事件监听器的时候,ASBroadcaster发出的事件才会生效。 拿Mouse对象来说吧, 它会在Flash中用ASBroadcaster自动初始化。它具有addListener和removeListener方法让你可以自行增加和删除你的监听器,并且当你按下、移动或者释放你的鼠标的时候,broadcastMessage方法也会自动执行。所以如果你按下你的鼠标,Flash会在内部执行下面的代码:
Mouse.broadcastMessage("onMouseDown"); 所有的Mouse对象的监听器, 比如movieclip(在flash中自动定义为Mouse对象的监听器),就会识别onMouseDown,并且运行关联的动作。 例2. 现在我们对ASBroadcaster有了一个简单的了解,我们可以用broadcaster对象自定义自己的广播器和响应它的监听器。这个例子还会沿用例一,那是属于你的监听器。它可以识别和监听事件的发生。 在这个例子里,我将会带你回到古老的两千多年前, 那儿有一个统治别人的国王和一些被驱使的奴仆。我们在这里所做的就是产生几个对象(一个是国王和一个从属于他的奴仆),然后用ASBroadcaster对控制他们之间的交互作用。国王, 作为国王,它将下达命令,而我们的奴仆将监听命令,当命令到达的时候就会执行一个特定的动作。所以我们必须建立这些对象,分别给这些对象定义属于它们的特点和能力。拿国王为例,当我们定义它为驱使者(用ASBroadcast.initialize)。这时我们的奴仆必须被驱使(用addListener),它成为国王的一个服务者并且被用命令指派它的工作。这里是代码:
King = {}; // 产生国王 ASBroadcaster.initialize(King); // 初始化国王为驱使者 subject = {}; // 产生奴仆 King.addListener(subject); //把它加到国王的被驱使者 //告诉我们的奴仆,他应该做的事 subject.onKingScream = function(){ trace("带葡萄过来!"); } // 这里我们让国王高吼两次, 用来加强语气,:) King.broadcastMessage("onKingScream"); King.broadcastMessage("onKingScream");
|
|
| 文章录入:skyuu 责任编辑:skyuu |
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |