博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flex中事件的初探
阅读量:5909 次
发布时间:2019-06-19

本文共 2473 字,大约阅读时间需要 8 分钟。

在flex中,Event是一个比较神奇,而且是我们必须经常打交道的一个类,黑羽大哥的一句话很经典:平生不识Event,就称闪客也枉然,说明了Event在Flash和Flex中的地位。

        那么这个非常重要的东西,该如何去应用呢?在这之前,我们要清楚一个事情,那就是Event是Object这个伟大父亲的220多个孩子之一,也就是说,它是直接继承于Object的。可是我们知道这有什么用处呢,嘿~,用处大啦,因为这代表了Event的贵族气质,即:在Event中,级别高的控件触发的事件,在级别低的控件中是无法被监听到的,怎么样,够高傲了吧。

        到了这里,有人会说,这有点扯了吧,只从这个就能看出这点吗?答案当然不是啦,原理听小生一一道来~

        在flex中,事件分成了两类,一个是系统事件,一个自定义事件。系统事件是包含鼠标点击,焦点获得等等。自定义,顾名思义,是自己定义的事件啦,但是要注意,自定义的事件必须要继承于Event这个类,否则,listener是不会搭理你滴~。那么自定义事件该如何定义呢,下面有一个例子,会对你有帮助。

 
import
 flash.events.Event;
 
 
public
 
class
 MyEvent 
extends
 Event
 
{      
     public function MyEvent (type:String, nextPage:String, bubbles:Boolean = false, cancelable:Boolean = false{
         super(type, bubbles, cancelable);
     }
  
 }

        够简单了吧,当然,这只是一个不包含任何其它处理的自定义事件。现在有人可能会问了,自定义方法中的参数有啥用,都是干哈的啊?嘿,暂时保密。

        有了自定义事件,那么我们的下一个问题就来啦,自定义事件有了,那么该如何触发,又如何监听呢,别着急啦~~,下面就说。

        在flex中,我们自定义触发事件用的是dispatchEvent(Event),里面存放的就是我们上面提到的自定义Event事件~。系统定义的触发事件,例如:<mx:Button id="testMs" x="71" y="295" label="Button" click = “”/>鼠标点击的事件等等。
那么监听的方法呢,监听是这样来定义的。

 function addEventListener(eventName:String, 
//
事件的KEY
                             listener:Function,   
//
事件的方法
                             useCapture:Boolean
=
false
//
确定侦听器是运行于捕获阶段、目标阶段还是上浮阶段。
                             priority:Integer
=
0
//
优先级
                             useWeakReference:Boolean
=
false
 
//
 是否设定为弱引用
                             ):

        怕了吧,是不是参数很多,和我们平时用的有点不太一样,我们平时,一般都是这样用的

testMs.addEventListener(MouseEvent.CLICK,changeVboxLabel);,

        后面多出的参数是什么意思呢?要想清楚知道这些,我们必须要先说明一下flex中事件处理的流程。
        在Flex中,触发事件后,流程分为三部分,例如,我们有下面这个

<
mx:Panel
>
    
<
mx:HBox
>
        
<
mx:VBox
>
                
<
mx:Button 
/>
        
</
mx:VBox
>
    
</
mx:HBox
>
</
mx:Panel
>

        假设,在<mx:VBox>中触发一个事件。事件的触发顺序是这样的,先捕捉,然后目标,最后上浮。
        捕捉:在我们刚才的假设中,首先触发器会按<mx:Panel>-><mx:HBox>-><mx:VBox>这个顺序来检查每个节点.这个阶段,我们称为捕捉阶段,在addEventListener的构造函数中,我们默认是不监听这个阶段的。
        目标:顾名思义,就是<mx:VBox>这个触发事件的节点。
        上浮:<mx:VBox>-><mx:HBox>-><mx:Panel>是按照这个顺来检查每个节点是否注册了监听。
        了解了Flex中事件的处理流程,那么我们可以解释addEventListener三个参数的意义啦。
        useCapture:Boolean=false,表示的,这个监听是能在目标阶段和上浮阶段进行监听
        useCapture:Boolean=true,表示的是这个监听只能在捕捉阶段进行监听。

        priority:Integer=0, 优先级,监听是有优先级的,那么通过这个字段,我们可以轻松的改变监听的优先级,是不是很方便,默认的时候为0;

        useWeakReference:Boolean=false // 是否设定为弱引用 这个参数的意思是,在该监听不使用的时候,是否允许垃圾回收器,将该监听回收。这个很重要,因为addEventListener有点类似千年老龟,生命周期比较长,如果没有被回收掉,会一直占着系统资源的。

        最后有一点,要非常注意,在UI的监听执行完毕后,一定要将该监听移除removeEventListener,否则,即使UI被移除掉,监听也不会被销毁。这个比较重要,因为一些看起来比较诡异的错误,大部分是因为这个导致的。

        现在来解惑先前的埋伏下的悬念:

        MyEvent (type:String, bubbles:Boolean = false, cancelable:Boolean = false)

        bubbles:Boolean = false:这个事件是否参与上浮阶段

        cancelable:Boolean = false // 确定是否可以取消 Event 对象

        所以,在application中,触发的事件,它的底层,是无法监听到的

转载于:https://www.cnblogs.com/programmer-wind/archive/2012/01/05/2919569.html

你可能感兴趣的文章
LoadRunner参数下载本地
查看>>
Linux安装配置ftp服务器
查看>>
radmin注册密码
查看>>
枫叶防注入程序漏洞
查看>>
AAA基础知识
查看>>
LG Display携手宝岛眼镜 不闪式3D亲民的新尝试
查看>>
mac下idea的使用之svn篇--有图超详细
查看>>
LACP和STP
查看>>
Docker管理工具Web UI:DockerUI & Shipyard
查看>>
OSSEC 加固linux系统详细配置
查看>>
CCNA配置试验之四 OSPF协议的配置
查看>>
RSA算法加解密示例
查看>>
分享一个消息组件
查看>>
kali系统网络设置
查看>>
[MySQL Reference Manual] 23 Performance Schema结构
查看>>
字符串大小写转换
查看>>
Silverlight游戏开发:引擎"Night"解析
查看>>
Asp.net中利用ExecuteNonQuery()执行存储过程返回-1解决方案
查看>>
【探索PowerShell 】【十三】WMI对象
查看>>
部署Symantec_Endpoint_Protection_11.0.4202
查看>>