说起这个对象,其实在很多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也可以实现)。
Stage:Stage的更加简单,只是当场景的大小发生变化(场景缩放)的时候获取onResize事件,前提条件是stage.scalemode=”noscale”且不是ShowAll显示。
lsn4 = new Object();
lsn4.onresize = function () {
trace("size changing...");
};
Stage.scaleMode="noscale";
Stage.addListener(lsn4);
TextField:
TextField可以获取的是onChanged和onScroller事件,我们结合昨天的部分程序写一个例子:
Movieclip.prototype.makeBox = function(x, y, l) {
this.lineto(x, y+l);
this.lineto(x+l, y+l);
this.lineto(x+l, y);
this.lineto(x, y);
};
createEmptyMovieClip("scrollUp",3);
with (scrollUp) {
lineStyle(1,0x999999,50);
moveTo(550,200);
beginFill(0x345678,20);
makeBox(550,200,30);
endfill();
}
duplicateMovieClip(scrollUp, "scrolldown", 4);
scrollUp._y-=60;
scrollUp.onPress=function(){txt.scroll--};
scrollDown.onPress=function(){txt.scroll++};
createTextField("txt",5,300,10,100,40);
txt.border=1;
txt.wordwrap=1;
txt.multiline=1;
txt.type="input";
lsn5 = new Object();
lsn5.onScroller = function () {trace("text scrolling") };
lsn5.onChanged = function () {trace("text changed") };
txt.addListener(lsn5);
当文本超过*长度的时候或者用户按下了scroll按钮的时候并且没有超过*/*scroll范围的时候取得onScroller响应;而用户输入文本的时候响应onChanged事件。
FStyleFormat:
FStyleFormat的Listener的作用针对于Components。当用户使用了Components UI或者自定义的Components的时候,如果使用了addListener,那么新的Components的样式就会继承为Listener的样式,例如常用的既是:
globalStyleFormat.background=0x333333;
globalStyleFormat.addListener(ckbox);
场景中存在了一个Components UI的check box的Instance,那么只要使用了addListener之后,那个instance的背景将跟随globalStyleFormat的背景色(自定义的styleFormat也可以)。
今天虽然写到现在已是很晚,但也幸福的有女朋友在旁边陪伴……
源文件:
注:
Listener和Handler
Listener和Handler的区别,从本质即可表达为一个是对象,一个是程序。