Flash MX 事件模型 |
| 作者:佚名 来源:闪吧 作者: Guy Watson 更新:2007-1-13 20:48:34 错误报告 我要投稿 |
转处:http://www.actionscripts.org 作者: Guy Watson , MX 101
在Flash MX的新特性里,我最喜欢的就是事件模式了,它使生活变得更加简单,使编写代码更加有趣,更加有组织化,如果你还不了解的话,现在就可以知道了。你正在遗漏,但是你不经意的正在使用。这篇文章希望能够帮助那些不管是初学者或者是超级用户。看过之后能够理解和使用Flash事件模式。我认为把一个新的东西解释给人们,让他们从中学到东西的办法就是将主题与人们生活有关联的东西进行比较,这是一个现实世界的类比。因此这篇文章用类比来表达一些概念...
你所需要知道的:
要想明白这篇文章的一些解释,你需要知道一些关于Flash的东西。首先,你需要知道Flash是面向对象的,因此你应该对Flash中的面向对象的编程有一个基本的了解。如果你能回答下面的问题,你就可以继续阅读这篇文章,你会明白一切。否则你必须查看这个页面,让你对Flash面向对象的编程有一个深入的了解: Robin Debreiul.
什么是对象? 什么是方法? 什么是属性? 什么是Flash中预定义的对象? 函数和方法有什么区别? 变量和属性有什么区别?
事件模式:
我们都想知道在世界上和地区里正在发生着什么,因此我们读报,看电视,上网去知道发生的事情。新闻是由正在发生的“事件”聚集而成。他们是有标签的“事件”因为他们是非常及时的报道,那么人们就想或者需要知道。
将Flash中的事件模式认为是新闻快报。它用Flash播放器的方式告诉我们一些正在Flash电影中发生的重要事件。当然这些新闻没有我们生活中发生的重要,但是作为一个脚本是很重要的.
因此从ActionScript来看事件模式是Flash内部的运转,它告诉Flash电影何时重要事情发生。
一个事件:
例如CNN, 将记者派出去寻找新闻,当世界上有事发生时,比如:火山爆发,这是一个标明的事件,它很重要。那么人们想知道或者需要知道。因此那些记者看火山爆发后,立刻向总部打电话,叫总部把这条新闻加到新闻快报,不要很长的事件,这条最新新闻通过电视,网页,收音机和他们科技向全世界传播。
同样,你的Flash电影也就这样,只不过长度小多了。Flash播放器有新闻报道,例如当使用者移动鼠标时,一个新闻报道鼠标移动很快的告诉总部(Flash播放器),并且让他们把最新的新闻加到新闻快报上去,因为报道知道这是一些Flash电影的目标所想知道的事情,很快最新事件在Flash中广播出来。
因此在actionscript中,一个事件是对行为状态的改变作出反应回答的告示,例如键盘上的一个按钮被按动,鼠标移动或者一个XML文件全部被下载。
事件操作者:
Flash播放器新闻快报与我们共享最新消息。因此我们可以行动,者就是说当我们被告知一个事件发生了的时候我们可以执行一段代码,这就是Flash事件操作者时间播放的方法。
事件操作者是一个你为用户对一个目标下定义所具体指定的程序。它会告诉目标在一个具体的事件发生时做什么。
因此在actionscript中,事件操作者是简单的一个任何用户下定义的属性,它包括参考和Actionscript的方法。方法被呼叫并且内码被执行。(当相关事件发生时)
分类事件:
Flash播放器的新闻快报分成了处理不同事件的几个部分。有所知道的目标,每一个预定义的actionscript对象,键盘,鼠标,电影片断,他们有自己的能密切注意与目标有关的事件的新闻记者。因此举个例子当鼠标被按下,当鼠标被释放,当鼠标被移动时,鼠标对象新闻报道仅仅是用来通知鼠标总部,当其中一个事件发生,新闻报道通知鼠标总部,总部然后播放新闻快报。
每一个部分的新闻报道所注意的事件的清单在Actionscript字典中.
下面是一个清单,包括非常普通的事件以及与他们有联系的事件操作者:
事件介绍 / 事件操作者
Mouse is moved/onMouseMove Mouse is pressed/onMouseDown Mouse is released/onMouseUp Key is pressed/onKeyDown Key is released/onKeyUp
因此来说,actionscript每一个预定义对象,比如说:鼠标,键盘,和电影片断有他们自己的与目标有关的事件。它对键盘目标包含与鼠标有关的事件是没有意义的...
监听者:
Listeners are user defined actionscript objects that are registered with specific departments of the flash players news bulletin, because they are interested in seeing the news that those departments broadcast. After an object has registered interest with one of the news bulletin departments, whenever an event occurs, that the news bulletin department is looking out for, a news broadcast is sent out and the registered object will receive it.
So in actionsript terms, a listener is an object that contains event handlers, the object registers with a specific predefined object so that it can receive the events related to that predefined object.
使用监听者方法:
我们有方法允许我们从新闻快报部分来在广播中注册和不注册我们的兴趣,为你和新闻快报部分以前注册一个目标。我们使用Addlistener方法,不注册的话我么使用movelistener方法,在这个例子中,我们的目标对鼠标目标广播有兴趣:
//create a new empty objectmyobject = new Object();//now register our interest with the Mouse objects broadcastMouse.addListener(myobject);
一下是一个在鼠标广播对象中我们不注册所使用的程序:
Mouse.removeListener(myobject);
因此,在Actionscript中,无论鼠标事件何时发生,"my object"的目标会被通知鼠标事件发生你并且了哪里发生。
为对象添加事件操作者:
在空白的对象中,我们创造了在广播中的行为"my object"它来自新闻快报的鼠标部分,我们需要告诉它当一个具体的事件发生时该做什么,于是你要知道,我们必须为对象对事件操作者下定义,对事件操作者下定义将会把"mouse wos moved"直接输出到窗上,不管鼠标什么时候移动,我们要使用on mouse move事件操作者,如下:
//create a new empty objectmyobject = new Object();
//now register our interest with the Mouse objects broadcastMouse.addListener(myobject);
//define the onMouseMove event handler for our objectmyobject.onMouseMove = function() { trace("Mouse was moved"); }; 将"Key was pressed"输出到窗口,无论什么时候按钮被按动,通过对上面的目标注册,通过键盘新闻快报部分的使用on keydown 事件操作者 :
//create a new empty objectmyobject = new Object();
//now register our interest in the Mouse objects broadcastMouse.addListener(myobject);
//define the onMouseMove event handler for our objectmyobject.onMouseMove = function() { trace("Mouse was moved");};
//now register our interest in the Key objects broadcastKey.addListener(myobject);
//define the onKeyDown event handler for our objectmyobject.onKeyDown = function() { trace("Key was pressed"); };
因此,在我们来解释一下当使用者在Actionscript中点击它的鼠标时发生了什么,不管什么时候点击鼠标目标通知"my object" on mouseDown事件发生了,然后引起了on mouse down事件操作者,转为代码将"mouse was moved"输出到窗口。
电影片断(Movieclip)和按钮(Button)的自动监听:
上一片我们讲过,一个对象想要接收事件通知,它必须和一个有这些事件的预定义对象一起注册。在Flash5里,Movieclip是从Movieclip类中引申下来的对象。现在在Flash MX中,Button也是从button类中引申出来的对象。每一个Movieclip实例的关系都自动和Movieclip"部门"注册到一起,每一个Button实例的关系都自动和Button"部门"注册到一起。这表示你不用明显地使用addListener方法来通知一个Movieclip。Button也是一样。所以以下代码是无错的:
//create a new movieclip on the _root timeline_root.createEmptyMovieClip("mymovieclip", 1);
//define the ‘onMouseMove’ event handler for our Movieclip_root.mymovieclip.onMouseMove = function() { //move this movieclip to the mouses position this._x = _root._xmouse; this._y = _root._ymouse;};
下面让我们来解释一下当用户移动鼠标后发生了什么,无论什么时候用户点击鼠标,Mouse对象通知mymovieclip对象一个onMouseMove事件发生了然后一个onMouseMove Event Handler被触发了,这个Event Handler执行了这段代码来移动这个Movieclip到鼠标的新位置。
所有Movieclip自动接收Key,Stage和Mouse事件的通知。
Flash 5 的事件模型(Event Model):
Flash 5 为Movieclip和button引进了一个基础的事件模型。在上一个例子中,我们当鼠标移动到一个新位置时Movieclip移动到鼠标的当前位置。如果你想在Flash 5中实现这段代码,你需要在Movieclip外加上这段代码:
onClipEvent (mouseMove) { this._x = _root._xmouse; this._y = _root._ymouse;} 或者如果当按钮被点击时我们需要运行一些代码,你需要在Button外加上这段代码:
on (press) { trace("Our button was pressed");}
上面这些代码,现在在Flash MX中用新的事件模型可以写成:
Yourbutton.onPress = function() { trace("Our button was pressed");};
为了兼容性,你仍然可以在Flash MX中使用Flash 5的旧事件模型,Macromedia公司没有官方地屏蔽这项功能,但是依我看还是考虑用新的吧,因为老的模型根本没有一点优势。
Flash MX不再需要Flem:
Branden Hall为Flash 5以插件的形式创立了一个事件模型叫Flem(谁知道这个东东是什么啊~~~?),和Flash MX的事件模型相比,它给你同样的创建事件模型的能力,因此库(Library)的用法就不是必需的了。
新事件模型的优势:
新的事件模型和旧的事件模型相比,第一个好处就是你可以在任何时间改变你的Event Handler,由此来改变当一个事件发生时function的执行方式。再有,因为一个Event Handler现在是一个对象的属性,它可以被删除,从而来节省CPU(有什么关系吗~~~~??)。在Flash 5里,你不能用attachMovie方法把一个Movieclip从一个Library贴出来,而且你不能给它赋予任何Event Handler,因为onClipEvent()必须在Movieclip里面定义,现在,这个可以很容易地在Flash MX里被实现。最后,Flash MX里的事件模型比Flash 5所提供的事件模型整洁和容易。
最后的笔记: 你可以为这篇文章添加内容和发布评论在它的原出处 FlashGuru''s MX 101. http://www.flashguru.co.uk/
这篇文章很适合中级的Flash作者,但我的翻译水平有限,请大家多批评。
|
|
| 文章录入:skyuu 责任编辑:skyuu |
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |