从Flash 5的时候,我就一直在抱怨为什么enterframe的速度这么固定还这么慢?为什么对于Key对象我还必须去手动建立一个MovieClip来接收事件并触发它?为什么我不能及时准确地接受到我需要的信息呢?亿万个“为什么”总是关于速度和效率的话题,终于Flash MX带来的一个新概念让我得到满足,那就是Listener——及时监听对象。
说起这个对象,其实在很多C语言程序中并不是什么新概念,它主要是作为测试环境中的消息接受器或者是改进程序的效率而存在的,但在Flash MX中恰到好处地出现了。
Listener对象需要包含调用目标所需要的事件集合,事件集合内可以定义对事件的处理程序,目标函数如果需要Listener对象,必须支持加入Listener的方法。
在Flash MX中支持Listener的对象有六种:FStyleFormat、Key、Mouse、Selection、Stage和TextField,通过addListener支持Listener。
Key:
在Key对象中的Listener可以获取onKeyDown和onKeyUp时间(当然,也没别的事件可以获取……),一个获取键盘按下和放开的事件监听:
lsn = new Object();
lsn.onKeyDown = function () {trace("down") };
lsn.onKeyUp = function () {trace("up") };
Key.addListener(lsn);
定义Listener的过程很简单,毕竟其本身既是一个对象,并且内部只需要响应事件的集合即可,最后通过支持Listener的方法来得到事件入口并开始触发响应。
Mouse:
Mouse可以给Listener获取的是onMouseDown、onMouseMove、onMouseUp事件,一个获取鼠标事件的例子:
createEmptyMovieClip("mc", 1);
lsn2 = new Object();
lsn2.onMouseUp = function () {trace("mouse up") };
lsn2.onMouseDown = function () {trace("mouse down") };
lsn2.onMouseMove = function () {trace("mouse moving...") };
mc.onMouseUp = function () {trace("movie mouse up") };
mc.onMouseDown = function () {trace("movie mouse down") };
mc.onMouseMove = function () {trace("movie mouse moving...") };
Mouse.addListener(lsn2);
这个例子也比较明了,但说明了一些事情。在有相同事件和Listener都存在的时候,也许你会问到优先级的问题,而也直接涉及到了Listener的生存周期问题。
Listener的概念存在不是为了抢/覆盖原目标程序的事件,是为了测试和提高程序运行效率而存在的,所以在Flash MX中的Listener也是同样,优先级会低于原目标事件的相同事件,而只有当目标的生存期消失或者目标使用了取消监听的方法才是Listener的生存期的重点。直观的可以表达为一个人正在吃饭碰巧一只蚊子在他吃饭的时候才喝你的血液,这个人吃多少它喝多少(大肚蚊子君),但不会影响到这个人正常的生活(知道拍死它或者这个人不小心正常/异常死亡为止)。
Selection:
Selection可以获取的只有onFocus事件。
createTextField("tf",2,100,200,100,20);
tf.text="my design sucks?";
lsn3 = new Object();
lsn3.onSetFocus = function () {trace("focus") };
Selection.addListener(lsn3);
Selection.setFocus(tf);
Selection的Listener只有在该对象获取焦点或者使用setFocus方法的时候才会触发,而这些的必要条件是用户使用鼠标点击了一个文本区(场景内存在一个文本区对象)。
不过如果增加onSelect该有多好……(其实用onMouseUp和getendindex也可以实现)。