38.is 运算符(对比instanceof)
AS3新增的关键字is,用来判断一个实例是否属于某一对象类型,它可以帮助我们确定对象类型,还可以判断类的继承关系,包括对于接口的继承执行。
var mySprite:Sprite = new Sprite(); trace(mySprite is Sprite);
trace(mySprite is DisplayObject); // true trace(mySprite is IEventDispatcher); // true
在as1/as2时,此类操作用的是instanceof运算符,AS3中用is运算符替代了instanceof,用来检查AS3中类的继承情况,但是它不能检查AS1形式的使用构造函数创建的动态类(dynamic classes).在这种情况下,你可以使用instanceof来实现,因为instanceof可以检查实例的原型链(prototype chain),原型链(prototype chain)相当于类的继承,实际上,AS3中的继承关系就是类的原型链(prototype chain)的镜像.这意味着instanceof对AS3仍然适用,当然推荐使用is运算符.
var mySprite:Sprite = new Sprite();
trace(mySprite instanceof Sprite); // true trace(mySprite instanceof DisplayObject); // true
trace(mySprite instanceof IEventDispatcher); // false - not in prototype chain var AS1StyleClass:Function = function(){} AS1StyleClass.prototype = new MovieClip();
var as1Instance:* = new AS1StyleClass();
trace(as1Instance instanceof AS1StyleClass); // true trace(as1Instance instanceof MovieClip); // true trace(as1Instance is AS1StyleClass); // true
trace(as1Instance is MovieClip); // false - cant see prototype chain
39.时间线和类关联
在Flash 9 中,你可以将包括主时间线在内的所有时间线与类关联,在AS2时通过设置linkage将类与MC关联,AS3中仍然是这样.而主时间线是通过设置属性面板中相应项,或者在发布设置—ActionScript设置,如下图: 属性面板:
发布设置:
实际上即使你没有将时间线与类关联,Flash也会自动为时间线创建一个类.当你将时间线与类关联时,时间线上的变量就变成了类变量,所有在时间线上定义的函数(使用function functionName(){}声明的)也就成了类的方法了.并且,当时间轴到达某一帧时,会自动调用此帧上的方法.因此,对于变量名和函数名,你只能声明一次,当然变量可以重复定义,但不能重复声明的,而函数是不能重复定义的,函数名也不能重复声明.
注意:不能把时间线上的脚本和与时间线关联的类中的脚本混淆了.
31
下面写在Flash 9中时间线第一帧代码:
var num:Number = 1;
function showNum():void { trace(num); }
showNum();
实际上相当于将下面这样一个类与时间线关联:
package {
class TimelineClass extends MovieClip { public var num:Number = 1;
public function showNum():void { trace(this.num); }
public function frame1():void { showNum(); } } }
40.Render事件
ActionScript一直以来都是依靠enterFrame事件来执行基于时间的行为的.尤其是卡通动画(animation)和关系到帧回放(playback)的动作.相比之下,Director的Lingo语言中,不仅仅有enterFrame事件,还有两个帧事件,prepareFrame和exitFrame.AS3.0尽管没有Lingo的这两个事件,但是它比以前增加了一个新的帧事件: render,或者叫Event.RENDER.
AS3的render事件发生在enterFrame事件之后,你可以在显示器屏幕刷新之前做你需要做的一些事情.和enterFrame事件不同的是,当使用render事件的显示对象(display object)进入舞台(stage)时,或者显示对象(display object)存在于舞台上的显示列表(display list)时才会触发事件,render事件不像enterFrame那样逐帧自动触发.要确保render事件在当前帧触发,必须调用stage.invalidate().
var sprite:Sprite = new Sprite(); stage.addChild(sprite);
sprite.addEventListener(Event.ENTER_FRAME, enterFrame); sprite.addEventListener(Event.RENDER, render); stage.addEventListener(MouseEvent.CLICK, click); function enterFrame(event:Event):void { trace(\}
function render(event:Event):void { trace(\
32
}
function click(event:MouseEvent):void { trace(\stage.invalidate(); } /*
Output: enter frame enter frame enter frame click
enter frame render
enter frame enter frame enter frame enter frame ... */
41.XML中表示属性的操作的运算符@
E4X(用于AS3的XML)增加了几个新的操作符来访问XML中的值,其中一个是用来访问属性的操作符 @,可以用它来代替attribute()(XML类的顶级方法)方法来获得属性值.
var myXML:XML = 也可以使用星标(*)和@操作符来得到XML结点所有属性的XMLList对象列表,这和attributes()方法类同. var myXML:XML = atts = myXML.attributes(); trace(atts.toXMLString()); /* Output: senocular 2867 */ atts = myXML.@*; trace(atts.toXMLString()); 33 /* Output: senocular 2867 */ 42.支持事件传递 AS3支持事件的传递,事件传递指的就是在对于嵌套对象中的每一个对象都能触发事件,而不只是一个事件引用 如果两个角色重叠,你点击了上面的角色,则只能获得从上面角色发送来的消息,即使你的点击碰巧发生在两个角色交叠的范围之内。 在AS1/AS2中,影片剪辑的类似”按钮”事件(如onPress,onRelease等等)不能被传递给它们的子剪辑的.这意味着虽然表面上你单击了影片剪辑的子剪辑,希望这个子剪辑来处理onPress事件,但是实际上onPress事件是由父剪辑来处理的,因为它阻隔了onPress事件传递给子剪辑. // AS1 and AS2 parent_mc.onPress = function(){ trace(\} parent_mc.child_mc.onPress = function(){ trace(\} /* click child output: parent pressed */ // AS3 parent_mc.addEventListener(MouseEvent.CLICK, parentClick); parent_mc.child_mc.addEventListener(MouseEvent.CLICK, childClick); function parentClick(event:MouseEvent):void { trace(\} function childClick(event:MouseEvent):void { trace(\} /* click child output: child pressed parent pressed */ 34 43.得到音频的波谱信息 AS3中使用SoundMixer类(flash.media.SoundMixer)可以得到在Flash中播放的音频文件的波谱信息,你可以制作和许多常用的多媒体播放程序一样的可视化效果.使用SoundMixer类中的静态方法ComputeSpectrum可以以一个BiteArray实例的形式呈现出声音的波谱信息,从而来创建视觉效果. ps:网上已经有类似的教程,自己找下吧 // play sound... var spectrumInfo:ByteArray = new ByteArray(); SoundMixer.computeSpectrum(spectrumInfo); // spectrumInfo is now a byte array with sound spectrum info 44.Number()的变化 在AS1/AS2时,使用Number()来将字符串转换为其对应的数值,如果字符串以”0″开头,则会被当作八进制数,同样,如果以”0x”开头会被当作十六进制数. // ActionScript 1 and 2 trace(Number(\trace(Number(\ 我们日常生活中的习惯用的是十进制数,上面的用法有时候不小心会造成错误.在AS3中就不用担心了,以”0″开头的字符串转换为数值,不再会被当作八进制数了.而以”0x”开头的仍然被当作十六进制. // ActionScript 3 trace(Number(\trace(Number(\ 如果要将字符串作为八进制转换,可以使用parseInt函数. trace(parseInt(\ 45.无用单元回收:引用计数算法和标记-清除算法 46.弱引用(Weak Reference) 47.Flash 9:BitmapData类和库中位图的使用 48.typeof运算符的变化 49.getBounds()和getRect()对比 50.for?in和for each?in 51.函数参数的默认值 45.无用单元回收:引用计数算法和标记-清除算法 Flash中的无用单元回收机制(Garbage Collection)用来自动清除内存中不再需要的变量,有两种算法执行: 35