穿梭于丛林之间  
一个热爱设计的孩纸,有着程序猿的情节,干着穿山越岭工作。

今天在学习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上注册一个方法,那么触发该事件时就会执行这个方法。
 
2.  事件监听
在分发中,我们讲到,如果不是通过注册通道来调用触发事件,那么我们是需要一个监听来捕捉的。如何捕捉到分发出的事件,就是通过事件的type值。

比如:
creationComplete='init()'
private function init(){
        testBtn.addEventListener(“click”, clickHandler);
}
  Flex的事件中都提供了一些静态常量,让我们调用,避免我们打错了。因此这句话可以这么写
testBtn.addEventListener(MouseEvent.CLICK,clickHandler);
  我们看到,监听的回调方法中没有传递参数,是的,这和通道的写法有些不同,这里的回调方法(即clickHandler)只是个引用,并不是代表方法的执行,他的含义是,告诉eventLinstener,如果捕捉到click事件,那么就去找clickHandler,并执行它,event对象参数在执行时动态的传递。
了解<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()方法是否只广播一次还是一直广播,还没有找到答案,希望在以后的学习中能找到答案。
  写完果断睡觉~
posted on 2013-04-25 17:19  perrychum  阅读(253)  评论(0)    收藏  举报