事件机制

摘自http://www.86cg.com/tutorial/2d/200701/404_5.html

http://www.blogjava.net/19851985lili/articles/101171.html


一直都不大明白事件的三个阶段有什么样的区别与作用,今天好好瞄瞄。

1.使用类静态属性,用const定义事件字符串名称变量。AS3.0中用了一个新的关键字定义了事件名称字符串变量,代码是public static const CLICK:String = "click";
2.事件发送的几种方法:(1). 继承EventDispatcher类;(2).合成EventDispatcher.类不是一个单纯事件发送类,而是在执行某个方法(method),比如doSomething()时,附带的发送一些事件。这些事件发送者往往是这个类的组成部分,一些更小的类,通常是Sprite等.那么用这种做法就比较合理. (3).实现IEventDispatcher接口来进行事件发送。

3.事件的传播:
事件触发后, Flex有3个检测事件监听器的阶段, 3个阶段的发生的顺序如下:
1. 捕获
2. 目标
3. 上浮
在任意一个阶段, 节点们都有机会操作事件. 比如: 用户点击了一个在VBox中的Button,
在捕获阶段, Flex检查Application对象(根节点)和VBox是否有监听器处理此事件. Flex然后在目标阶段触发按钮的监听器.
在上浮阶段, VBox和应用以与捕获阶段相反的顺序再次获得机会处理事件.
在Actionscript3.0中,你可以在任意目标节点上注册事件监听器. 但是部分事件会被直接传给目标节点,比如Socket类.
捕获阶段的节点顺序是从父节点到子节点的, 而上浮阶段刚好相反.
捕获事件缺省是关闭的,也就是说如果要捕获事件, 必须显式指定在捕获阶段进行处理.
每一个Event都有target和currentTarget属性, 帮助跟踪事件传播的过程.

捕获阶段:
在捕获阶段,Flex在显示列表中检查事件的祖先是否注册了事件的监听器. Flex从根节点开始顺序而下.
大多数情况中, 根节点是Application对象. 同时, Flex改变事件的currentTarget值.
缺省情况下, 在此阶段,没有容器监听事件. use_capture参数的值是False,在此阶段添加监听的唯一方法是在调用add_listener时,
传入一个为True值的use_capture参数, 比如:
myAccordion.addEventListener(MouseEvent.MOUSE_DOWN, customLogEvent, true);
如果是在Mxml中添加监听, Flex设置此参数为False, 没有办法进行修改.
如果设置了use_capture为True, 那么事件将不会上浮. 如果既想捕获又想上浮就必须调用 addEventListener两次.
一次use_capture参数为true, 一次为false;
捕获很少使用, 上浮的使用更为普遍.

目标阶段:
在目标阶段, Flex激发事件的监听程序, 不检查其他的节点.

上浮阶段:
事件只在bubbles属性为True时才进行上浮. 可以上浮的事件包括: change, click, doubleClick, keyDown, keyUp, mouseDown, mouseUp.
在上浮阶段, Flex改变事件的currentTarget属性, 而target属性是初始派发事件的对象.

查询事件阶段:
使用事件的eventPhase可以获得事件当前的阶段,
1: CAPTURE_PHASE
2: AT_TARGET
3: BUBBLING_PHASE
示例: private function determineState(event:MouseEvent):Void { Debug.trace(event.eventPhase + ":" + event.currentTarget.id); }

停止传播:
使用下面两个函数停止事件的传播:
stopPropagation()
stopImmediatePropagation()


另:想要[color=red]接收[/color]或者发送事件都必须必须继承EventDispatcher,这点在使用自定义事件时注意下


另如:
dynamic public class Settings extends Proxy implements IEventDispatcher {

public static const INIT:String = "init";
private static var instance:Settings;
private var eventDispatcher:EventDispatcher;
public var data:XML;
private var urlLoader:URLLoader;

public function get isLoaded():Boolean {
return data != null;
}

public function Settings(enforcer:SingletonEnforcer) {
[color=red]eventDispatcher = new EventDispatcher();[/color]
}

private function onXMLDataLoaded(event:Event):void {
data = XML(urlLoader.data);
dispatchEvent(new Event(Settings.INIT, true, true));
}

public static function getInstance():Settings {
if(Settings.instance == null) {
Settings.instance = new Settings(new SingletonEnforcer());
}
return Settings.instance;
}

flash_proxy override function getProperty(tt:*):* {
trace (data[tt.toString()]);
return data[tt.toString()];
}

public function loadSettings(url:String):void {
var urlRequest:URLRequest = new URLRequest(url);
urlLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, onXMLDataLoaded);
urlLoader.load(urlRequest);
}

public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, weakRef:Boolean = false):void {
[color=red]eventDispatcher.addEventListener(type, listener, useCapture, priority, weakRef);[/color] }

public function dispatchEvent(event:Event):Boolean {
[color=red]return eventDispatcher.dispatchEvent[/color](event);
}

public function hasEventListener(type:String):Boolean {
return eventDispatcher.hasEventListener(type);
}

public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void {
eventDispatcher.removeEventListener(type, listener, useCapture);
}

public function willTrigger(type:String):Boolean {
return eventDispatcher.willTrigger(type);
}

}

}

class SingletonEnforcer {}





学AS3也有三个月了,说实话速度的确是慢得出奇,到现在还不会灵活使用dynamic,static这些家伙,也难怪他说我根本不是编程的料。是啊,他看我就像一武林高手看一三岁小毛孩舞剑,不屑一顾。悲哀呀,明明一编程高手在身边却没有任何的帮助。他不屑,而我不想被他那神情所伤。路,一直都是我一个人在走,不晓得已经走了多少弯路。就像一没爹没娘的崽,自个洗衣,自个刷牙……


跟他又闹矛盾了,呵~~~


Secrets Makes A Woman Woman.

你可能感兴趣的:(FLEX)