加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flex学习笔记7——事件

发布时间:2020-12-15 01:18:25 所属栏目:百科 来源:网络整理
导读:概念 ??????? 所有可视化对象都会派生自己的事件,每个组件都可以注册多个监听器。 ???????? EventDispatcher 和 IeventDispatcher 负责实现事件模型, IeventDispatcher 包含事件模型应该具备的基本方法:派发事件和注册监听器,移除监听器。 ?????? 当注册

概念

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

???????? 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,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));

       }

    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读