事件就是让你的上级或下级干活的一个机制,你负责在适当的时候抛出事件,上级或下级在捕获你这个事件执行回调方法即可。
flex的事件处理得益于EventDispatcher基类,InteractiveObject类提供了鼠标、键盘、聚焦、拖拽等事件支持,继承于它的UI组件又自定义了各种的特有事件,我们在适当的时候捕获(监听)它就可以。
我们先看看捕获到的事件有包含了那些东东:
1、所有事件都继承于flash.events.Event基类,自身就是实现了很多基础事件类型,详细点连接看。
2、加上自己的构造方法,先看事件的构造方法Event(type:String, bubbles:Boolean = false, cancelable:Boolean = false)
type表示事件的名称,我们根据这个名称来捕获它,bubbles表示是否向上抛出事件,cancelable表示可以取消Event带来的行为
(发生事件时,该事件在事件流的三个阶段中移动:捕获阶段,该阶段从显示列表层次结构的顶部流动到目标节点之前的节点;目标阶段,该阶段只包括目标节点;冒泡阶段,该阶段从目标节点的后续节点沿显示列表层次结构向上往回流动。)
用 Event.cancelable
属性来检查是否可以防止与特定事件关联的默认行为。如果 Event.cancelable
的值为 true
,则可以使用 preventDefault()
来取消事件;否则,preventDefault()
无效。)
3、重写Event的clone()方法。返回一个新的Event对象即可。
下面是我自己写的一个自定义事件:
有了这个东西,我们就可以在适当的时候抛出它,然后由抛出者上级的对象去捕获,添加回调函数OK。
然后我们看看如何抛出这是事件:
如果事件是可视化组件抛出,且设置事件构造函数bubbles为true时,则可以在“事件流”中传送直到被捕获,很像java异常的感觉,但是只在可视化组件通过addChild()方法组成显示列表中组件中传播。我们现在写一个继承UIComponent基础组件,让它抛出我们刚刚定义的MyEvent,触发条件是设置num的值时抛出。
调用setNum()方法是可能触发事件,自己根据需要设置事件的触发点吧,可以参照各个可视化组件自定义事件的触发原理,代码是开源的,点开看就是。好了一个事件抛出了。
最后我们看看怎么捕获这个事件:
在事件抛出的“事件流”上都可以捕获这个事件,可以选择处理也可以选择继续抛出(太像异常了)。我们在事件没有发生前就做好准备,当事件发生是调用我们准备好的方法——这个事情叫做监听,那个方法叫做回调方法。下面是监听函数定义,来自EventDispatcher类
addEventListener(type:String,listener:Function,useCapture:Boolean=false,priority:int=0, useWeakReference:Boolean = false)
第一个参数 type 就是我们定义的时间名称,MyEvent.MY_TYPE_1
第二个参数 是回调函数,自带这个捕获的事件实例。
第三个参数 是可视化组件中,是否捕捉冒泡类型的时间(也就是子节点抛出的事件)。false是捕获冒泡的-_-!
第四个参数 是优先级,那些是优先处理的事件,注意处理过程还是异步的。
第五个参数 false是强引用,不会被垃圾回收机制回收,但是要记得释放 removeEventListener()。
下面是实现捕捉的实例:
好了,debug看看输出吧,一个自定义事件完成。想象一下这个num表示水库的水位-_-!