下面有两个很简单的一个例子:
例子一:
button.addEventListener("click",showText); //给按钮添加一个事件,第一个参数是事件的类型,第二个参数是调用什么方法
internal function showText(evt:MouseEvent):void{
txt.text = "click a button";
}
例子二:
btn1.addEventListener(MouseEvent.CLICK,onClick);
internal function onClick(evt:MouseEvent):void{
Alert.show("你点击了一下按钮","提示");
}
事件流:
调用事件会经过三个阶段:
1、捕获阶段:从根节点到子节点,检测对象是否注册了监听器,是则调用监听函数
2、目标阶段:调用目标对象本身注册的监听程序
3、冒泡阶段:从目标节点到根节点,检测对象是否注册了监听器,是则调用监听函数
注意:事件发生后,每个节点可以有2个机会(2选1)响应事件,分别是捕获和冒泡阶段,默认关闭捕获阶段
上面事件流可能看的有些生疏,比如一个界面中放了画布1,在画布1上放置了画布2,在画布2上面放置了按钮,在按钮1上注册了一个事件,
捕获阶段是从画布1->画布2->按钮1,然后到达目标阶段,检测到按钮1有注册事件,然后从按钮1->画布2->画布1(这个阶段称为冒泡阶段)
IEventDispatcher接口:
addEventListener(); //注册事件监听器
removeEventListener(); //移除事件监听器
dispatchEvent(); //派发事件
EventDispatcher类,参见手册
addEventListener()方法
此方法有5个参数:
参数1:调用事件的类型
参数2:调用什么方法
参数3:捕获阶段调用是否开启,默认不开启
参数4:优先级,值越大,优先级越高,
参数5:是否使用弱引用,默认是false,不使用弱引用(使用强引用),这个类似于java中的垃圾收集,如果改为true时就会收回垃圾
Event对象
Event类作为创建Event对象的基类,当发生事件时,Event对象将作为参数传递给事件监听器
最长见得如:MouseEvent,KeyboardEvent
自定义事件
1、创建自定义事件名称的Event
dispatchEvent(new Event("myEvent",true,false));
2、创建扩产事件类
Public class MyEvent extends Event{
......
}
示例一:dispatchEvent()方法的使用方法:本示例效果是:点击按钮后会弹出文本框“触发了"+Event1_.0.cav注册的:testEvent"事件”
<mx:Script> <![CDATA[ import mx.controls.Alert; internal function init():void{ cav.addEventListener("testEvent",onShow); btn.addEventListener(MouseEvent.CLICK,onClick); trace("1:addEventListener"); } internal function onClick(evt:MouseEvent):void{ trace("2:dispatchEvent"); cav.dispatchEvent(new Event("testEvent",true,false)); } public function onShow(evt:Event):void{ //evt.currentTarget:目前的事件流进了那个组件 //evt:target:是谁调用了这个事件(就是说事件流的目标是什么) //如果不用if:要是按钮放在画布或其他容器上,其他容器注册了和按钮相同的事件,那么点击一次按钮后同一个方法就可能执行两次以上 if(evt.currentTarget == evt.target){ Alert.show("触发了"+evt.currentTarget+"注册的:"+evt.type+"事件"); } } ]]> </mx:Script> <mx:Canvas x="37" y="47" width="200" height="299" id="cav" borderColor="#08436C" backgroundColor="#563D3D"> </mx:Canvas> <mx:Button x="421" y="57" label="Button" id="btn"/>
第二个示例:定义类使用extends关键字自定义方法
//此自定义事件的功能是:调用事件的时候在构造方法中传入值,然后将值赋值到data变量中 package com.events { import flash.events.Event; public class NewEvent extends Event { public static const NEWCLICK:String="newevent"; public var data:String; public function NewEvent(type:String,data:String) { this.data=data; super(type, false, false); } } }