韩式写真摄影工作室:谈谈事件机制
来源:百度文库 编辑:九乡新闻网 时间:2024/10/04 04:50:50
谈谈事件机制 ===============================================================================================================================
(一)什么是事件?
让我们来举几个例子让大家明白其中的道理
举例一--天地会会员注册量超过20000
事件类型:天地会新闻
事件类型再细分: 有关注册量的新闻
事件时间:2008年11月27日
事件敏感数字: 20000
举例二---鼠标滚轮向上滑动
事件类型:MouseEvent
事件类型再细分:滚轮动作
事件信息:向上滚动(dlta>0)
举例三---用户按下字母键F
事件类型:keyBoardEvent
事件类型再细分:键盘被按下
事件信息 :keyCode=45
由上面三个例子可以看出,事件没什么好神奇的,事件不过就是新闻或者消息罢了。
新闻有政治的,有八卦的,有科技的,也有经济的。所以事件也可以分类,有鼠标事件、键盘事件、加载完成等等事件。
新闻(消息)有发生时间,发生地点,相关人物,所以AS3的事件里面也包含各种信息。鼠标事件里面可以有鼠标点了哪一个Sprite,鼠标点击处的坐标等信息、而键盘事件里面则可以有键盘是被按下还是被弹起,按下键的ASCII值,以及Ctrl是否被按下等信息。
===============================================================================================================================
(二)什么是目标对象(target),当前目标对象(currentTarget)?
首先要知道所有的事件都是由FlashPlayer的事件管理中心发出的,当鼠标点击一个Sprite时,FlashPlayer会向这个Sprite发送一个鼠标事件对象(MouseEvent)从而形成一个事件流,而同在舞台的另一个Sprite则不会收到FlashPlayer发出的事件,因为事件流是流向前一个Sprite的不会经过第二个Sprite。
熟悉AS2的人知道,在AS2时代很多在内层的MovieClip都被剥夺了响应鼠标的权力。AS3为我们提供了强大的DOM事件流机制,使得所以对象都有平等的权力接收到相关事件信息。
事件流的三个阶段:
对于可显示对象我们应建立显示对象列表的概念,一个即使对象有大小有颜色,如果不被addChild到舞台(或者已经在舞台上的显示对象)里是不会显示的,这样FlashPlayer在渲染时候只需要渲染显示对象列表中的对象即可,可以大大节约资源。
当一个显示对象不在显示列表中时,FlashPlaye会把事件直接派送给它,这个时候就没有事件流,也没有捕获阶段和冒泡阶段,only目标阶段。
例如:
但是当多个显示对象重叠的时候,经典的事件流出现了。(附图一)
首先用代码生成附图一
当我们用鼠标点击蓝色部分时,鼠标点击处最内层的对象是inner,如前面所说,AS3中要保证所有对象都有平等接收事件消息的权力。捕获阶段便是为解决这一问题而设的,
1.首先PlashPlayer发出一个鼠标事件对象(一个信封),把它送到显示对象列表(outer,mid,inner都在显示列表中)。
2.捕获阶段的任务是找到鼠标点击处最内层的对象,也就是目标对象(target),所以事件对象(FlashPlayer寄出来的那封信)沿着显示对象列表一直往下找,先找到outer再找到mid,再找到inner,在这个找的过程中,事件在流动,所以形成了事件流。
3.终于我们找到了目标对象(target)inner,目标阶段也就到了,FlashPlayer终于保证了最基层群众也有知情权。
4.现在基层群众接收到了事件,它看完之后,事件对象(那封信)开始往回上传了,传说中的冒泡阶段开始了,outer,mid又一次接收到了同一个事件。
所以目标对象(target)一般来说都是最里层的对象也就是FlashPlayer要找的基层群众,在上面的例子中target始终是是inner
当前对象(currentTarget)则是注册侦听器的对象,一般是容器也是事件流当前流经的注册了侦听器的对象,在上面的例子中currentTarget先后是inner,mid,outer
正确地区分target和currentTarget非常重要。如果我们要用Sprite做一个按钮,按钮里面在放一个TextField用来显示按钮名称(附图二),代码如下:
(一)什么是事件?
让我们来举几个例子让大家明白其中的道理
举例一--天地会会员注册量超过20000
事件类型:天地会新闻
事件类型再细分: 有关注册量的新闻
事件时间:2008年11月27日
事件敏感数字: 20000
举例二---鼠标滚轮向上滑动
事件类型:MouseEvent
事件类型再细分:滚轮动作
事件信息:向上滚动(dlta>0)
举例三---用户按下字母键F
事件类型:keyBoardEvent
事件类型再细分:键盘被按下
事件信息 :keyCode=45
由上面三个例子可以看出,事件没什么好神奇的,事件不过就是新闻或者消息罢了。
新闻有政治的,有八卦的,有科技的,也有经济的。所以事件也可以分类,有鼠标事件、键盘事件、加载完成等等事件。
新闻(消息)有发生时间,发生地点,相关人物,所以AS3的事件里面也包含各种信息。鼠标事件里面可以有鼠标点了哪一个Sprite,鼠标点击处的坐标等信息、而键盘事件里面则可以有键盘是被按下还是被弹起,按下键的ASCII值,以及Ctrl是否被按下等信息。
- 经典语录:一切都是对象(All is object)
===============================================================================================================================
(二)什么是目标对象(target),当前目标对象(currentTarget)?
首先要知道所有的事件都是由FlashPlayer的事件管理中心发出的,当鼠标点击一个Sprite时,FlashPlayer会向这个Sprite发送一个鼠标事件对象(MouseEvent)从而形成一个事件流,而同在舞台的另一个Sprite则不会收到FlashPlayer发出的事件,因为事件流是流向前一个Sprite的不会经过第二个Sprite。
熟悉AS2的人知道,在AS2时代很多在内层的MovieClip都被剥夺了响应鼠标的权力。AS3为我们提供了强大的DOM事件流机制,使得所以对象都有平等的权力接收到相关事件信息。
事件流的三个阶段:
- 1 捕获阶段 (EventPhase.CAPTURING_PHASE)包括从舞台到目标节点范围内的所有节点
- 2 目标阶段 (EventPhase.AT_TARGET)权包括目标节点
- 3 冒泡阶段 (EventPhase.BUBBLING_PHASE)从目标节点的父节点返回到舞台的行程中遇到的节点
对于可显示对象我们应建立显示对象列表的概念,一个即使对象有大小有颜色,如果不被addChild到舞台(或者已经在舞台上的显示对象)里是不会显示的,这样FlashPlayer在渲染时候只需要渲染显示对象列表中的对象即可,可以大大节约资源。
当一个显示对象不在显示列表中时,FlashPlaye会把事件直接派送给它,这个时候就没有事件流,也没有捕获阶段和冒泡阶段,only目标阶段。
例如:
- var i=0;
- var s = new Sprite();
- s.addEventListener(Event.ENTER_FRAME,onEnter);
- function onEnter(evt:Event) {
- i++;
- s.name=i;
- trace(s.name);
- }
但是当多个显示对象重叠的时候,经典的事件流出现了。(附图一)
首先用代码生成附图一
- //outer
- var outer = new Sprite();
- outer.name="Outer";
- outer.graphics.beginFill(0xFF0000);
- outer.graphics.drawRect(0,0,100,100);
- //mid
- var mid = new Sprite();
- mid.name="mid"
- mid.graphics.beginFill(0x00FF00);
- mid.graphics.drawRect(0,0,50,50);
- //inner
- var inner = new Sprite();
- inner.name="inner";
- inner.graphics.beginFill(0x0000FF);
- inner.graphics.drawRect(0,0,25,25);
- //addChild
- outer.addChild(mid);
- mid.addChild(inner);
- addChild(outer);
- outer.x=outer.y=100;
- //添加侦听器
- outer.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
- inner.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
- mid.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
- function mouseDownHandler(evt:MouseEvent){
- trace("事件流当前阶段:"+evt.eventPhase)
- trace("鼠标点击处最内层的显示对象(target)是:" + evt.target.name)
- trace("事件当前流经显示对象(currentTarget)是:"+evt.currentTarget.name)
- trace("===============================================================")
-
- }
- 事件流当前阶段:2
- 鼠标点击处最内层的显示对象(target)是:inner
- 事件当前流经显示对象(currentTarget)是:inner
- ===============================================================
- 事件流当前阶段:3
- 鼠标点击处最内层的显示对象(target)是:inner
- 事件当前流经显示对象(currentTarget)是:mid
- ===============================================================
- 事件流当前阶段:3
- 鼠标点击处最内层的显示对象(target)是:inner
- 事件当前流经显示对象(currentTarget)是:Outer
- ===============================================================
当我们用鼠标点击蓝色部分时,鼠标点击处最内层的对象是inner,如前面所说,AS3中要保证所有对象都有平等接收事件消息的权力。捕获阶段便是为解决这一问题而设的,
1.首先PlashPlayer发出一个鼠标事件对象(一个信封),把它送到显示对象列表(outer,mid,inner都在显示列表中)。
2.捕获阶段的任务是找到鼠标点击处最内层的对象,也就是目标对象(target),所以事件对象(FlashPlayer寄出来的那封信)沿着显示对象列表一直往下找,先找到outer再找到mid,再找到inner,在这个找的过程中,事件在流动,所以形成了事件流。
3.终于我们找到了目标对象(target)inner,目标阶段也就到了,FlashPlayer终于保证了最基层群众也有知情权。
4.现在基层群众接收到了事件,它看完之后,事件对象(那封信)开始往回上传了,传说中的冒泡阶段开始了,outer,mid又一次接收到了同一个事件。
所以目标对象(target)一般来说都是最里层的对象也就是FlashPlayer要找的基层群众,在上面的例子中target始终是是inner
当前对象(currentTarget)则是注册侦听器的对象,一般是容器也是事件流当前流经的注册了侦听器的对象,在上面的例子中currentTarget先后是inner,mid,outer
正确地区分target和currentTarget非常重要。如果我们要用Sprite做一个按钮,按钮里面在放一个TextField用来显示按钮名称(附图二),代码如下:
- var button=new Sprite();
- button.graphics.beginFill(0xFF0000);
- button.graphics.drawRect(0,0,50,25);
- var t=new TextField();
- t.text="START";
- button.addChild(t);
- addChild(button);
- button.x=button.y=100;
- //button.mouseChildren=false
- addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
- function mouseDownHandler(evt:MouseEvent) {
- evt.target.visible=false;
- }