Flex学习笔记7——事件

来源:互联网 发布:java rpc实例 编辑:程序博客网 时间:2024/04/28 20:24

概念

       所有可视化对象都会派生自己的事件,每个组件都可以注册多个监听器。

         EventDispatcherIeventDispatcher负责实现事件模型,IeventDispatcher包含事件模型应该具备的基本方法:派发事件和注册监听器,移除监听器。

       当注册了监听器,使用完后要使用remove移除

         事件对象必须是EventEvent的子类

addEventListener

       priority:优先级,设置事件监听函数的顺序

         userWeakReference:弱引用和垃圾回收有关

 

用途

         事件对象存储数据

         事件对象成员函数操作事件对象和影响事件处理系统的行为

派发规则

1.       当事件源对象是一个不在显示列表中的孤立对象时,只有自己是目标对象

2.       当事件源对象在显示列表中,则派发顺序从最顶级的stage向下经过各级父显示对象,到达事件源对象,如果事件对象在构造时设定事件的bubbles属性为true,则会返回到达舞台对象,冒泡阶段不是必须的。

则:

           Stage可以接收所有显示对象派发的事件

           Stage第一个接收到显示对象派发的事件

 

3.       某些类型的事件(enterFrameInit)会直接派发给事件源对象,而不参与捕获和冒泡阶段。

事件派发不是异步的,如

           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.  创建事件类,类中新建静态常量(事件类型),并定义需要传递的属性,重写toStringformatToString,否则不会自定义事件中的新属性

3.  需要传递参数才需要自定义事件类,否则只需在发出事件的类中创建事件类型常量,如下:

            dispatchEvent(new Event("type"))    addEventListener("type",function)

拖拽事件

       Flex组件内置了拖拽事件的接口,有些控件已经实现拖拽功能,如ListDataGridMenu TileListTree

       当在不同类型控件见拖拽时,数据源的数据结构必须兼容

       开发自定义的拖拽:对提供方的mouseDown,mouseOverdragComplete方法监听,对接收方的dragEnter  dragDrop  dragOver  drageExit事件监听

 

修改默认事件处理

                   如:默认关闭变成关闭前提示确认后关闭

                   思路:在组件外部定义事件处理程序,执行优先级高于默认的事件处理程序。

1.       组件内部:创建事件对象时,设置cancelabletrue

dispatchEvent(new Event(“alarm”,false,true))

2.       组件内部:添加默认事件处理程序,设置优先级EventPriority.DEFAULT_HANDLER

addEventListener(“alarm,handleAlarm,false, 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,false,EventPriority.DEFAULT_HANDLER,true);       }              privatefunction testEventHandler(e:Event):void {           //检查默认处理程序是否被阻止           if(!e.isDefaultPrevented()) {              Alert.show("事件默认处理程序");                        }        }              publicfunction run():void {           //第三个参数 true,代表可通过event.isDefaultPrevented() 取消事件           this.dispatchEvent(new Event("test",false,true));       }    }}

原创粉丝点击