`
zhangzuanqian
  • 浏览: 268821 次
  • 来自: ...
社区版块
存档分类
最新评论

Flex中自定义事件2

阅读更多

copy from :http://www.blogjava.net/kissjava/archive/2008/08/26/224539.html

 

关于flex事件的讲解

一.引

很多新人对Flex的事件机制都不太熟悉,在使用过程中难免会出现各种问题,这是一个非常普遍的问题,为了更快更好的帮助大家,将介绍一下Flex中事件的各种机制和用法。

Flex的精髓之一就是事件和绑定机制,了解之后,能帮助大家更灵活的设计程序,也对新手上路有一定的帮助。

讲解可能不太系统,也不全面,有很多没有深入。如果高手看到后有疑问,欢迎指正。当然各位也可以提出自己的看法,或者经验分享,谢谢。

二.事件机制介绍

1.      什么是事件机制

事件可以看作是一种触发机制,当满足了一定的条件后,会触发这个事件。比如MouseEvent就是指的当鼠标进行操作之后触发的一系列的事件。很多控件 中都有click事件,这个事件就是一个MouseEvent的实例,当点击鼠标后,系统会自动抛出一个名称为click的MouseEvent事件(这 种方法我们将在后面介绍到)。如果此时在click上注册一个方法,那么触发该事件时就会执行这个方法。

大致示意图
 
该示意图对应的Flex主应用的mxml代码

< mx:Script >
          
<! [CDATA[
                import mx.controls.Alert;        
                private 
function  clickHandler(e:MouseEvent) {
                      Alert.show(e.currentTarget.toString());
                }

          ]]
>
</ mx:Script >
< mx:Button id = " testBtn "  click = " clickHandler(event) "  label = " 测试 " >
</ mx:Button >




在我们写代码时,编辑器的代码补全提示列表中,有很多不同的图标,如图

那些带有闪电的就是事件,三个小块的就是样式,空心圆圈的是属性,实心圆点的是公有方法,还有一个是效果。

我们能在这个列表中看到的事件,我把它称之为事件注册通道。(官方仍然称它为事件,但是它又和普通的事件含义不同。关于事件注册通道会再下面讲述到)

2.      事件注册通道

上面说到了,这些通道是只能在mxml的代码提示中可以看到的,他的作用就是给mxml组件提供 事件触发时所执行的方法的注册通道,而且能在代码提示中可见,这样给组件提供了很大的抽象的好处,我们可以很清楚的告诉组件的使用者,组件里包含哪些事件给你调用。
为什么把他区别对待?除了代码提示外,他还有一些实现上的不同。

Button的click事件是继承自核心类InteractiveObject,遗憾我们看不到他的源码,但是说明了“事件注册通道”是可以继承的。

我们会在自定义事件中讲述到如何声明“事件注册通道”。

3.      事件触发方法

注册通道中如果填入了函数,那么就代表触发该事件时,会执行这个方法。

click="clickHandler(event)"

我们看到这个方法有一个event对象作为参数传入,新人可能会问到,这个event对象哪里来的?我也没声明这个变量啊。他实际上是注册通道传给他的,默认变量名就是event。我们如果想在事件触发时传其他的参数,可以通过自定的事件对象来实现。

这个对象就是这个组件分发的事件对象,即type为“click”的MouseEvent的一个实例。

这个event对象包含了触发该事件时的各种信息,比如触发事件对象是哪个,监听对象是哪个,触发时鼠标点在哪里等等,不同的event类会包含不同的属性,比如KeyboardEvent包含了键盘点击了哪个键。

我们也可以通过自定义一个事件类,来传递我们自己想要的各种信息。(这在后面将介绍到)

4.      事件分发(重点了)

最终继承自EventDispatcher的对象都会含有dispatchEvent这个方法,他有一个参数,事件对象。

之前说到的事件注册通道,他只是一个通道,实际上事件是由这个方法来分发出去的,通道只是一个管道而已。

他的作用就是分发一个事件对象,他的分发是没有目的的,一种广播形式的,Flex的事件监听线程会接收到各种各样的事件(我们称之为捕获事件,这在后面会介绍到),那么哪种才是你要的事件,标识就通过事件的type属性来区分。

1)事件对象
在分发事件时,将会分发一个事件对象出去。不管是那个事件类,都是继承自flash.events.Event对象的,他包含一些比较重要的属性,type和bubbles。
type是事件的类型,事件监听通过这个参数来识别是否是自己所监听的事件。
bubbles是个布尔值,决定了该对象是否会向上传递。默认是false。什么意思呢?画个图就明白了。
比如说,当button组件分发click事件对象时,设置的bubbles为false,那么他的分发是这样的

示意代码
dispatchEvent(new MouseEvent( “click” , false ));

事件对象无法跨越组件本身,当然,除了之前讲到的注册通道(这样就很形象了吧)

因此,如果没有注册通道,在Flex主应用中,就无法捕获到这个button组件分发出的事件。

如果我们将Bubbles设为true,他看起来就是这样
dispatchEvent(new MouseEvent( “click” , true ));


可以看到,这个事件可以跨过组件本身,到达Flex主应用里。不止这样,在帮助手册中明确说到,如果在传递过程中间一直没有被捕获的话,这个事件会逐层上传,直到最终的stage,那时如果还没被捕获,这个事件就会被销毁掉。

这样一来,即使我们没有click的事件通道,只要我们在Flex主应用中添加事件监听器(addEventListener)那么我们就可以获得到这个分发出的click事件了。

那么,注册通道不是没用了吗?不是,之前说到过,注册通道是现式的,可见的,因此如果你的组件要给其他人使用,那么就非常一目了然,而不必知道你源码中究竟分发了什么事件。但是,不要监听和注册同一个事件,这样会重复执行的。(后面将讲到)

5.      事件监听

在分发中,我们讲到,如果不是通过注册通道来调用触发事件,那么我们是需要一个监听来捕捉的。如何捕捉到分发出的事件,就是通过事件的type值。

比如:
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml layout="absolute" xmlns:comp
      creationComplete='init()'
>
<mx:Script>
                <![CDATA[
private function init(){
                    testBtn.addEventListener(“click”, clickHandler);
}


Flex的事件中都提供了一些静态常量,让我们调用,避免我们打错了。因此这句话可以这么写

testBtn.addEventListener(MouseEvent.CLICK,clickHandler);


我们看到,监听的回调方法中没有传递参数,是的,这和通道的写法有些不同,这里的回调方法(即clickHandler)只是个引用,并不是代表方法的执 行,他的含义是,告诉eventLinstener,如果捕捉到click事件,那么就去找clickHandler,并执行它,event对象参数在执 行时动态的传递。(如果熟悉ajax的朋友这里应该很容易懂了)

他作用起来就是这样

如果你又注册了click的事件通道,那么这两个都会生效,显然这是多余的。

      6.  关于异步和执行顺序

以前的说法有误,as里是不存在线程概念的,在远程请求时,结果事件、错误事件都是异步的。如果你需要处理结果,需要利用监听,并在回调中获取你的远程数据。
而在处理本地事件时,他们仍然是同步的。(谢谢ltian 的指正)

异步示意图

上图可以看出,回调方法执行的顺序甚至还不如dispatchEvent之后的方法。如果接下来的方法依赖于事件回调,那么把接下来的方法写到回调方法中去


三.绑定机制

      在我们了解了事件机制后,那么理解绑定就不难了。绑定其实也是事件机制的运用

      1.  什么是绑定
绑定的原理就是事件,在被绑定的对象上增加了改变事件的监听,一旦某个被绑定对象改变后,就会分发一个“propertyChange”事件(默认的,也 可以改变成自己定义的事件),在其他组件中,会有propertyChange的事件监听,当捕捉到该事件后,则会去更新组件的属性并显示。

绑定的作用在于,将Flex中的变量、类、方法等与组件的值进行绑定。例如,一个变量如果被绑定后,那么引用该变量的组件的相关属性也会发生改变。我们用一个实例来表示

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml layout="absolute" xmlns:comp
      >
      <mx:Script>
          <![CDATA[
                import mx.controls.Alert;           
                [Bindable]
                private var isSelected:Boolean;
                private function clickHandler(e:MouseEvent){
                //Alert.show(e.currentTarget.toString());
isSelected=isSelected?false:true; //这句话的意思是如果isSelected为true,改变它为false,如果它为false,改变它为true;
                      Alert.show(isSelected.toString());
                }
          ]]>
      </mx:Script>
      <mx:Button id="testBtn"  click="clickHandler(event)" label="测试" />
      <mx:CheckBox x="60" selected="{isSelected}" />
</mx:Application>

上述程序的效果就是,当点击button时,button不是直接改变checkbox的选中状态,而是改变isSelected这个变量,由于isSelected是被绑定了的,那么会关联的改变CheckBox的选中状态。

这样看起来有些多此一举,完全可以直接改变checkbox的selected属性,我只是为了演示一下效果。如果说你的checkbox是动态构造的上百个,你不会去一个个的改变他吧。

因此,我们多数会将一个数据源进行绑定声明,这样引用了这个数据源的控件,比如datagrid,在数据源发生了改变时,即使你不重新设置dataProvider,列表的数据也会刷新。当然,还有很多应用等待你去尝试。

如果这个代码中取消了[Bindable]的声明,会怎么样?isSelected不会改变了吗?

isSelected会改变,我们alert出来的结果也会显示结果改变了,但是checkbox的选择状态不会改变,因为当一个组件由创建到最终显示出 来时是经过很多方法的,比如addChild,commitProperties,updateDisplayList 等,updataDisplayList则是类似刷新显示效果一样的方法。

仅仅改变属性,而不去更新显示效果那么组件不会因为属性的改变而发生任何变化。
 
绑定的原理也是利用的事件分发。更复杂的绑定有待你去自己发现了



四.  自定义事件的分发

      这部分就不长篇大论了,因为各位应该已经掌握了事件的原理,因此贴出演示源码,并进行些简单的解释。

      1.  自定义事件 components/MyEventTest.as
      package components
{
      import mx.events.FlexEvent;
      public class MyEventTest extends FlexEvent
      {
          public static const ONCHANGE:String = "onChange";
          public var eventInfo:String; //自定义的事件信息
          public function  MyEventTest(s:String){
                super(s); //如果在构造时不设bubbles,默认是false,也就是不能传递的。
                eventInfo="这个事件是:"+s;
          }
      }
}

          2.        自定义组件 components/ComponentForEvent.as
package components
{
      import flash.events.EventDispatcher;
      //这个就是声明事件注册通道的方法了。name是事件对应的名称,也就是之前提到的type。Type是该事件的类
      [Event(name="onChange", type="components.MyEventTest")]
      public class ComponentForEvent extends EventDispatcher
      {
          private var name:String;
          public function changeName(newName:String){
                this.name=newName;
                dispatchEvent(new MyEventTest(MyEventTest.ONCHANGE) );
          }
      }
}

3.        App.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:comp
>
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private function  changeName(){
                    cfe.changeName("新名称");
}
                ]]>
</mx:Script>
<mx:Button id="testBtn"  click=" changeName ()" label="测试" />
<components:ComponentForEvent
id="cfe"  />
</mx:Application>

分享到:
评论

相关推荐

    flex4自定义事件用法

    自定义事件是Flex开发中的一个重要概念,允许开发者扩展内置事件系统,以满足特定项目的需要。下面将详细介绍Flex4自定义事件的用法,以及如何在一个完整的项目中导入和运行。 1. **创建自定义事件类** - 首先,...

    flex自定义组件事件DEMO

    4. 示例学习:在"flex自定义组件事件DEMO"中,你可以看到如何在自定义组件中创建并派发自定义事件,以及如何在其他地方监听和响应这些事件。通过分析代码,可以了解事件生命周期、事件冒泡和捕获的概念,以及如何在...

    flex 自定义控件、事件

    这个主题聚焦于“flex自定义控件与事件”,这是一个关键的开发概念,特别是对于那些希望深入理解Flex架构和提升应用用户体验的开发者来说。 自定义控件在Flex开发中扮演着重要角色,它们允许开发者根据项目需求创建...

    flex自定义事件、简单例子说明

    通过上述示例,我们可以看到Flex自定义事件的强大功能及其在实际项目中的应用。自定义事件不仅可以帮助我们更好地组织代码逻辑,还能实现更复杂的交互需求。掌握如何创建和使用自定义事件对于提高Flex应用的开发效率...

    Flex4自定义组件开发.pdf

    在Flex4中,自定义组件的开发变得尤为重要,因为它允许开发者创建高度定制化的UI组件,以满足特定的应用需求。 #### 二、Spark组件架构剖析 Flex4采用了全新的Spark组件架构,与之前的Flex3(Halo组件架构)相比有...

    flex 高级自定义组件

    Flex中的高级自定义组件开发是构建复杂用户界面的关键技术,它允许开发者超越基本组件的限制,以满足特定的业务需求和视觉设计。在创建高级组件时,了解并掌握一些核心方法的重写至关重要,这些方法涉及到组件的生命...

    Flex自定义组件和事件

    ### 二、Flex自定义事件 #### 1. 为什么需要自定义事件 Flex的内置事件(如 MouseEvent 和 Event)可能不足以满足所有交互需求。自定义事件允许开发者创建具有特定含义和数据的事件,以更好地匹配应用的业务逻辑。...

    flex3自定义DownloadProgressBar

    1. 事件监听:在Flex中,可以使用addEventListener方法监听特定事件,如HTTPService的result或fault事件,或者自定义的下载事件。 2. 进度更新:当接收到下载进度更新事件时,需要调用ProgressBar的...

    Flex Mobile自定义实现的弹出对话框

    在Flex Mobile中,自定义实现弹出对话框是一项常见的需求,这通常涉及到用户交互和界面设计的灵活性。 对话框在移动应用中扮演着重要的角色,它们可以用来显示警告、询问用户输入或者进行一些特殊操作。在Flex ...

    ActionScript的自定义组件及自定义事件例子

    自定义组件和事件在Flex应用程序中发挥着关键作用,使开发者能够构建高度定制的用户界面和交互逻辑。 总的来说,掌握ActionScript的自定义组件和自定义事件是提升Flash和Flex开发技能的重要一步。通过实践和研究...

    flex 事件与自定义事件

    如何接收事件?如何做到AS3.0的标准事件编程? 类似JAVA的监听或观察者模式 Event改变的部分很多,正在想怎样用一个有条理的方式来讲解Event和它相关的诸多内容,让我们感到比较容易理解,记忆和接受。

    Flex手机项目自定义List的ItemRenderer

    在实际项目中,你可以根据需要在自定义的ItemRenderer中添加更多的逻辑,比如事件监听器,以便在用户与列表项交互时执行特定的操作。 总之,通过继承和扩展IconItemRenderer,我们可以实现Flex手机项目的List组件的...

    Flex 自定义ToolTip

    ### Flex自定义ToolTip详解 在Flex开发中,`ToolTip`是一种非常实用的界面元素,用于在用户悬停或聚焦某个控件时显示额外的信息。默认情况下,Flex提供了基本的`ToolTip`功能,但有时为了满足特定的设计需求或者...

    flex4自定义组件皮肤

    在Flex4中,自定义组件皮肤是提升应用视觉效果和用户体验的重要手段。下面将详细介绍如何在Flex4中自定义组件皮肤。 1. **组件皮肤的基本概念** - 组件皮肤是Flex中改变组件外观的一种方式,通过定义不同的皮肤,...

    Flex4 自定义通用ImageButton

    在Flex4中,自定义组件是一项重要的技能,它允许开发者根据特定需求创建具有独特功能和外观的用户界面元素。本话题聚焦于自定义一个通用的`ImageButton`组件,该组件结合了图像和按钮的功能,提供了更丰富的交互体验...

    Flex4视频教程_02-03用AS自定义事件.rar

    本视频教程聚焦于Flex4中ActionScript(AS)的自定义事件使用,这在开发过程中非常重要,因为它允许开发者扩展和定制应用程序的通信机制。 自定义事件是Flex编程中的一个关键概念,它允许开发人员创建具有特定业务...

    Flex 自定义组件ImageViewer

    在Flex中,自定义组件是开发者根据项目需求创建的特殊UI元素,可以扩展和定制标准的MX或Spark组件。本示例着重于一个名为“ImageViewer”的自定义组件,这通常是一个用于展示图像并可能包含缩放、平移等交互功能的...

    Flex开发自定义控件

    #### 二、Flex自定义控件概述 在Flex中,自定义控件是指根据特定需求构建的新控件,这些控件可以基于现有的Flex标准控件进行扩展,也可以完全从头开始创建。自定义控件的主要优势在于能够提供更符合特定业务场景的...

    4、Flex3自定义事件、事件冒泡及传值、组件间的函数回调及传值

    NULL 博文链接:https://futurewwm.iteye.com/blog/1277119

    Flex4视频教程_02-02用mxml自定义事件.rar

    在"Flex4视频教程_02-02用mxml自定义事件.rar"这个资源中,我们将探讨如何在MXML中定义和使用自定义事件。 首先,理解事件模型的基础至关重要。在Flex中,事件是`flash.events.Event`类的子类。要创建自定义事件,...

Global site tag (gtag.js) - Google Analytics