AS3初学者容易迷糊的几个问题

1.Sprite/MovieClip的Enter_Frame事件,不受addChild/removeChild影响

简单点讲:Sprite或MovieClip对象一旦为其添加了Enter_Frame事件监听,对应的Enter_Frame处理函数将会马上被调用,并一直执行下去(不管你是否将其addChild到显示列表,或者将其从显示列表removeChild),直到该对象removeEventListener相应的监听器为止。

同样:MovieClip一旦被new出来,就会自动播放(在未用任何代码stop()的前提下),不管你是否将其addChild或removeChild

注:其它事件也类似,在AS3的世界中,事件一旦被监听,要想停止事件响应,唯一的方法只能是removeEventListener。(这一点跟c#中完全不同,在c#中不管是webform还是winform,一旦按钮被disabled了,肯定就无法触发按钮的Click事件,但在AS3中,组件是否被禁用,跟组件是否能响应事件完全是没有任何关联的!)

测试代码:

var _sprite:Sprite = new Sprite();
_sprite.graphics.lineStyle(1,0);
_sprite.graphics.beginFill(0xff0000);
_sprite.graphics.drawCircle(0,0,50);
_sprite.graphics.endFill();

_sprite.addEventListener(Event.ENTER_FRAME,onSpriteEnterFrame);//实际上:程序执行到这里就会一直不停的跑onSpriteEnterFrame了

function onSpriteEnterFrame(e:Event):void{
	trace("我是_Sprite",getTimer());
}

addChild(_sprite);
_sprite.x = stage.stageWidth/2 ;
_sprite.y = stage.stageHeight/2 ;

_sprite.addEventListener(MouseEvent.CLICK,onSpriteMouseClick);

function onSpriteMouseClick(e:MouseEvent):void{
	removeChild(_sprite);//移除自己
	_sprite=null;//注意:即使把自身设置为null,原来注册的onSpriteEnterFrame函数仍会一直执行,正确的方法只能用removeEventListener才能移除Enter_Frame事件
	//_sprite.removeEventListener(Event.ENTER_FRAME,onSpriteEnterFrame);
}

2.ADDED、ADDED_TO_STAGE、REMOVED、REMOVED_FROM_STAGE这几个事件的区别

var _container:Sprite = new Sprite();

_container.addEventListener(Event.ADDED,onAdded);
_container.addEventListener(Event.ADDED_TO_STAGE,onAddedToStage);
_container.addEventListener(Event.REMOVED,onRemoved);
_container.addEventListener(Event.REMOVED_FROM_STAGE,onRemovedFromStage);

function onAdded(e:Event):void {
	trace("onAdded:",e);
}

function onAddedToStage(e:Event):void {
	trace("onAddedToStage:",e);
}

function onRemoved(e:Event):void {
	trace("onRemoved:",e);
}

function onRemovedFromStage(e:Event):void {
	trace("onRemovedFromStage:",e);
}

addChild(_container);
//onAdded: [Event type="added" bubbles=true cancelable=false eventPhase=2]
//onAddedToStage: [Event type="addedToStage" bubbles=false cancelable=false eventPhase=2]

var _sub:Sprite = new Sprite();

_container.addChild(_sub);
//onAdded: [Event type="added" bubbles=true cancelable=false eventPhase=3]

/*_container.removeChild(_sub);
//onRemoved: [Event type="removed" bubbles=true cancelable=false eventPhase=3]*/

removeChild(_container);
//onRemoved: [Event type="removed" bubbles=true cancelable=false eventPhase=2]
//onRemovedFromStage: [Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2]

_container.removeChild(_sub);
//onRemoved: [Event type="removed" bubbles=true cancelable=false eventPhase=3]

区别:

ADDED是子对象被添加到自身时触发,ADDED_TO_STAGE是对象本身被添加到显示列表时触发;类似的:REMOVED当子对象从自身移除时触发,REMOVED_FROM_STAGE是自身从显示列表中移除时触发;

ADDED/REMOVED事件会冒泡,而ADDED_TO_STAGE/REMOVED_FROM_STAGE不冒泡,也就是说每次addChild或removeChild自身时,下面的ADDED/REMOVED事件也会冒泡上来先被触发,然后才触发ADDED_TO_STAGE/REMOVED_FROM_STAGE事件.

时间: 2024-10-04 18:09:39

AS3初学者容易迷糊的几个问题的相关文章

J2EE基础:对于Spring初学者的学习建议

j2ee|初学 一.首先Java的基础.面向对象的基础和设计模式的基础知识是必不可少的. 如果连这些基础知道都不够扎实的话,我建议还是先去补补课.关于设计模式我觉得不用学太多,但以下三个模式是学习Spring必不可少的:factory模式(包括简单工厂和抽象工厂),Strategy模式,Template method模式.如果不掌握这些你就根本没法领悟Spring的精髓,只能依样画葫芦地照搬,这是很可怕的事. 关于这方面的书的建议已经够多的,我就不说了.我这里强烈建议的书可能让人有点意外,那就是

对于Spring初学者的学习建议

一.首先Java的基础.面向对象的基础和设计模式的基础知识是必不可少的. 关于设计模式我觉得不用学太多,但以下三个模式是学习Spring必不可少的: factory模式(包括简单工厂和抽象工厂) Strategy模式 Template method模式 如果不掌握这些你就根本没法领悟Spring的精髓,只能依样画葫芦地照搬,这是很可怕的事. 我这里强烈建议的书可能让人有点意外,那就是Expert one on one J2EE design and development的第四章,这一章不仅仅是

C#编程利器之三:接口(Interface)

C#接口是一个让很多初学者容易迷糊的东西,用起来好象很简单,定义接口,然后在里面定义方法, 通过继承与他的子类来完成具体的实现.但没有真正认识接口的作用的时候就觉得用接口是多此一举,当 然你这样想是绝对错误的.在软件设计中有一个非常重要的原则就是:面向接口编程,依赖与接口或抽象 层.可见接口在真正的开发中是多么的重要. 在之前C#编程利器之一:类(Class)一文里介绍了类的相关知识,本文主要介绍OO编程中的另一个重要 知识点--接口.在某种程度上说,接口也是类,一种特殊的类或抽象类. 更准确说

数字比较大小

问题描述 请高手看看这个数字比较大小的程序那里有问题在线急等谢谢int[]a=newint[]{2,5,6,1,30,3};intb;for(inti=0;i<=a.Length-1;i++){for(intj=1;j<=a.Length;j++){b=a[j];a[j]=a[i];a[i]=b;}}for(inti=0;i<a.Length;i++){Console.BackgroundColor=ConsoleColor.Yellow;Console.ForegroundColor=

.NET简谈设计模式之(抽象工厂模式)

我们继续学习设计模式系列文章. 今天要讲的是设计模式中经常被用到的"工厂模式",所谓工厂模式就是将对象的创建交给一个叫做工厂的对象来统一进行处理.主要是将对象的依赖关系进行解耦,消除对象之间的直接耦合.那么工厂的使用有几种方式呢?那就要看我们对工厂的理解了,工厂是创建对象的一个逻辑名称,工厂可以是一个方法.一个静态类等等.只要起到对象的创建就能给它赋予上一个工厂的名称. 那么什么是抽象工厂呢?我想很多人对它的理解并不是很透彻,甚至有的人就觉得工厂一定要是抽象的.我表示不理解,一个抽象类

FLASH AS3 中使用URLRequest 和URLLoader 与服务器交互

request|服务器|交互 AS3 中使用URLRequest 和URLLoader 与服务器交互 AS3 中使用 URLLoader 与 URLRequest 取代了先前版本 LoadVars 方法. 初学者可能又会迷糊了.在现在帮助系统没有完善的情况下 (Flash 9 没有帮助, Flex Builder 2 的只有英文), 这里写篇简单的教程, 方便大家往 AS3 过渡. 在 AS3 中, 有关于网络操作的内置类全部在 flash.net 里. 下面是本教程要用到的类的清单 : URL

Flash AS3简单制作百叶窗图片特效

Flash AS3简单制作百叶窗图片特效,适合初学者的教程,希望大家能练习! 图片百叶窗特效: 制作过程: 任意选择一个图片,当做本例动画中的图片,我们将使该图片达到百叶窗动画特效. 然后按Ctrl+J修改文档的属性,设置任何颜色为背景都可以,大小调整到和自己选择的图的大小一样大就可以了,幁频设置为38fps 就可以. 把图层1命名为photo,把外部准备的图片导入到舞台,然后按F8转变为原件,类型是影片剪辑, 然后拖拽到舞台,打开属性面板,设置如下:

Flash AS3简单制作美女图片缓动特效gif动画

  Flash AS3简单制作美女图片缓动特效gif动画过程,本教程主要适合初学者,希望大家练习,可以先看下相关文章:Flash AS3简单制作图片变成百叶窗特效教程 制作步骤: 新建立文档,调整文档属性,如下图设置: 和上一个实例教程一样,导入一个图片是影片剪辑,然后制作一个文字按钮,设置如下: 然后再建立一个新图层,在第一帧中添加如下代码: 代码如下: import fl.transitions.*; import fl.transitions.easing.*; myButton.addE

Flash AS3简单制作图片变成百叶窗特效教程

  Flash AS3简单制作图片变成百叶窗特效方法,适合初学者的教程,希望大家能练习! 图片百叶窗特效: 制作过程: 任意选择一个图片,当做本例动画中的图片,我们将使该图片达到百叶窗动画特效. 然后按Ctrl+J修改文档的属性,设置任何颜色为背景都可以,大小调整到和自己选择的图的大小一样大就可以了,幁频设置为38fps 就可以. 把图层1命名为photo,把外部准备的图片导入到舞台,然后按F8转变为原件,类型是影片剪辑, 然后拖拽到舞台,打开属性面板,设置如下: 然后创建一个新图层,绘制一个文