今天在学习Flex中,有这么《用mxml自定义事件》一节,对其理解不透彻,思来想去,决定弄个明白。
代码如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 3 xmlns:s="library://ns.adobe.com/flex/spark" 4 xmlns:mx="library://ns.adobe.com/flex/mx" 5 minWidth="955" minHeight="600" 6 creationComplete="application1_creationCompleteHandler(event)"> 7 <fx:Declarations> 8 <!-- 将非可视元素(例如服务、值对象)放在此处 --> 9 </fx:Declarations> 10 <fx:Script> 11 <![CDATA[ 12 import mx.events.FlexEvent; 13 protected function button1_clickHandler(event:MouseEvent):void 14 { 15 dispatchEvent(new Event("Clicked")); 16 } 17 protected function application1_creationCompleteHandler(event:FlexEvent):void 18 { 19 this.addEventListener("Clicked",ClickHanker); 20 } 21 private function ClickHanker(e:Event):void 22 { 23 trace("事件被调用") 24 } 25 ]]> 26 </fx:Script> 27 <fx:Metadata> 28 [Event(name="Clicked",type="mx.events.FlexEvent")] 29 </fx:Metadata> 30 <s:Button label="按钮" click="button1_clickHandler(event)"/> 31 </s:Application>
对于此代码的功能有很多不解,故在google查了一下“flex自定义事件”,研究了一下,感觉理解起来还是很空洞,不如先理解flex的事件机制,便查到了一篇文章《Flex事件讲解》http://blog.sina.com.cn/s/blog_b82b59370101ck3s.html,里面有几句话大受启发:
1. 什么是事件机制
事件可以看作是一种触发机制,当满足了一定的条件后,会触发这个事件。比如MouseEvent就是指的当鼠标进行操作之后触发的一系列的事件。很多控件中都有click事件,这个事件就是一个MouseEvent的实例,当点击鼠标后,系统会自动抛出一个名称为click的MouseEvent事件。如果此时在click上注册一个方法,那么触发该事件时就会执行这个方法。
事件可以看作是一种触发机制,当满足了一定的条件后,会触发这个事件。比如MouseEvent就是指的当鼠标进行操作之后触发的一系列的事件。很多控件中都有click事件,这个事件就是一个MouseEvent的实例,当点击鼠标后,系统会自动抛出一个名称为click的MouseEvent事件。如果此时在click上注册一个方法,那么触发该事件时就会执行这个方法。
2. 事件监听
在分发中,我们讲到,如果不是通过注册通道来调用触发事件,那么我们是需要一个监听来捕捉的。如何捕捉到分发出的事件,就是通过事件的type值。
比如:
在分发中,我们讲到,如果不是通过注册通道来调用触发事件,那么我们是需要一个监听来捕捉的。如何捕捉到分发出的事件,就是通过事件的type值。
比如:
creationComplete='init()' private function init(){ testBtn.addEventListener(“click”, clickHandler); }
testBtn.addEventListener(MouseEvent.CLICK,clickHandler);
接着,查看了adobe的帮助文档http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/mxml/metadata.html,
了解
<fx:Metadata>的含义 : 可以使用
<fx:Metadata> 标签在 MXML 文件中插入 metadata 标签。Metadata 标签为 Flex 编译器提供了描述在 Flex 应用程序中如何使用 MXML 组件的信息。Metadata 标签不会被编译为可执行代码,但提供了用于控制如何编译相应的代码部分的信息。例如,可以创建一个定义新事件的 MXML 组件。若要使 Flex 编译器知悉该事件,以便在 MXML 中对其进行引用,可以在该组件中插入 [Event] metadata 标签,如下例所示:
<fx:Metadata> [Event("darken")] </fx:Metadata>
那么,可以这样理解源代码中:
<fx:Metadata> [Event(name="Clicked",type="mx.events.FlexEvent")] </fx:Metadata>
这句告诉Flex编译器,需要新增并编译一个叫“Clicked”,type是mx.events.FlexEvent类型的事件;
当编译完成时,并且Application也creationComplete时,就会发生this.addEventListener("Clicked",ClickHanker);
上一句的意思就是:告诉eventLinstener,如果捕捉到Clicked事件,那么就去找clickHandler,并执行它,flex只是编译了这个事件,还没有对他进行广播,所以没有trace("事件被调用"),当按钮按下时,这时候dispatchEvent(new Event("Clicked")),意思为广播“Clicked”事件,这时候在Flex中才真正出现"Clicked"事件,才能被eventLinstener捕获到,才能执行clickHandler。
最后还有一事不明白,从整个代码来看,当按钮按下时,便会执行dispatchEvent(new Event("Clicked"))广播一次事件,dispatchEvent()方法是否只广播一次还是一直广播,还没有找到答案,希望在以后的学习中能找到答案。
写完果断睡觉~

浙公网安备 33010602011771号