Flex学习笔记7——事件
概念???????所有可视化对象都会派生自己的事件,每个组件都可以注册多个监听器。 ???????? EventDispatcher和IeventDispatcher负责实现事件模型,IeventDispatcher包含事件模型应该具备的基本方法:派发事件和注册监听器,移除监听器。 ?????? 当注册了监听器,使用完后要使用remove移除 ???????? 事件对象必须是Event或Event的子类 addEventListener ? ???? priority:优先级,设置事件监听函数的顺序 ???????? userWeakReference:弱引用和垃圾回收有关 ? 用途???????? 事件对象存储数据 ???????? 事件对象成员函数操作事件对象和影响事件处理系统的行为 派发规则1.?????? 当事件源对象是一个不在显示列表中的孤立对象时,只有自己是目标对象 2.?????? 当事件源对象在显示列表中,则派发顺序从最顶级的stage向下经过各级父显示对象,到达事件源对象,如果事件对象在构造时设定事件的bubbles属性为true,则会返回到达舞台对象,冒泡阶段不是必须的。 则: ?????????? Stage可以接收所有显示对象派发的事件 ?????????? Stage第一个接收到显示对象派发的事件 ? 3.?????? 某些类型的事件(enterFrame和Init)会直接派发给事件源对象,而不参与捕获和冒泡阶段。 事件派发不是异步的,如 ?????????? This.dispatchEvent(e); ?????????? Trace(‘s’);?? ? //会在所有监听器执行完毕后才执行 mxml自定义事件组件定义?????? <mx:Metadata> [Event(name="DataChange",type="DataChangeEvent")] </mx:Metadata> ? ??????????? 而且在as中要有dispatchEvent DataChange事件的代码 访问方式 ???????? <ns1:EmployeeCombo x="146" y="132" DataChange="onChange(event)" /> ???????? ?我的理解是: 调用端通过DataChange,其实是 EmployeeCombo.addEventListener(DataChange,function(event:DataChangeEvent)),子组件中this.dispatchEvent(new DataChangeEvent()). 所以才能接收,而且对自定义组件也适用。 As自定义事件1.? 发出事件的类,继承自EventDispatcher或者实现IeventDispatcher 2.? 创建事件类,类中新建静态常量(事件类型),并定义需要传递的属性,重写toString或formatToString,否则不会自定义事件中的新属性 3. ?需要传递参数才需要自定义事件类,否则只需在发出事件的类中创建事件类型常量,如下: ??????????? dispatchEvent(new Event("type"))??? addEventListener("type",function) 拖拽事件?????? Flex组件内置了拖拽事件的接口,有些控件已经实现拖拽功能,如List,DataGrid,Menu, TileList,Tree。 ?????? 当在不同类型控件见拖拽时,数据源的数据结构必须兼容 ?????? 开发自定义的拖拽:对提供方的mouseDown,mouSEOver,dragComplete方法监听,对接收方的dragEnter? dragDrop? dragOver? drageExit事件监听 ? 修改默认事件处理?????????????????? 如:默认关闭变成关闭前提示确认后关闭 ?????????????????? 思路:在组件外部定义事件处理程序,执行优先级高于默认的事件处理程序。 1.?????? 组件内部:创建事件对象时,设置cancelable为true dispatchEvent(new Event(“alarm”,false,true)) 2.?????? 组件内部:添加默认事件处理程序,设置优先级EventPriority.DEFAULT_HANDLER addEventListener(“alarm”,handleAlarm,EventPriority.DEFAULT_HANDLER,true) 3.?????? 组件外部:自定义事件处理程序中,调用event.preventDefault阻止默认的执行 4.?????? 组件内部:默认事件处理程序中,使用event.isDefaultPrevented() 判断是否阻止了默认执行,并执行相应逻辑 handleAlarm中 ???????????if(!event.isDefaultPrevented()) 组件外部: <remote:MyComponent test="testHandler" /> privatefunction testHandler(e:Event):void { e.type; e.preventDefault(); //阻止默认事件处理程序的执行 }
组件内部: package remote { import flash.events.Event; import mx.controls.Alert; import mx.core.EventPriority; import mx.core.UIComponent; [Event(name="test",type="flash.events.Event")] publicclass MyComponent extends UIComponent { publicfunction MyComponent() { //为alarm添加默认事件监听,default_handler为低优先级,可以使得外部的事件监听优先执行,从而用户 //可以通过e.preventDefault() 来取消默认事件处理程序 this.addEventListener("test",testEventHandler,true); } privatefunction testEventHandler(e:Event):void { //检查默认处理程序是否被阻止 if(!e.isDefaultPrevented()) { Alert.show("事件默认处理程序"); } } publicfunction run():void { //第三个参数 true,代表可通过event.isDefaultPrevented() 取消事件 this.dispatchEvent(new Event("test",true)); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |