AS3方法和技巧
1.改变影片的帧频
2.类方法的作用域和类绑定 3.Graphics对象和绘图接口(API) 4.新的变量类型 5.显示对象 6.新的引入指令 7.唯一的类变量 8.新的鼠标移动事件
1. 改变影片的帧频
在AS3中,充许通过Stage类动态地改变影片的帧频.
每一个Sprite或者MovieClip实例都有一个stage属性,这个属性关联到一个Stage对象.可以通设置Stage对象的frameRate属性的值来调整影片播放时的帧频.frameRate值的大小范围为0.01至1000.
//改变帧频为12帧/s stage.frameRate=12;
2.类方法的作用域和类绑定
ActionScript 3 是完全基于类的,当你创建了一个类的时候,你也创建了与这个类相关的变量和函数(方法)以及类的实例,和ActionScript 2不同的是,ActionScript 3.0 中的方法类在的范围内调用. 即使函数被绑定给其它对象,然后通过这个对象调用函数,这个函数的调用范围仍然是函数所在的类,和Function.call和Function.applye用法一样.
package {
import flash.display.Sprite;
public class ClassScope extends Sprite { public function ClassScope() { traceThis(); // \var obj:Object = new Object(); obj.traceThis = traceThis;
obj.traceThis(); // \
traceThis.call(new Sprite()); // \}
public override function toString():String { return \}
public function traceThis():void { trace(this); } }
1
}
注:as2时代常用的Delegate可以不用了。更不用麻烦的使用下面的方法了,
var owner = this;
function clickHandler():Void {
//do something..
owner.someMethod(); }
3.Graphics对象和绘图接口(API)
和AS1和AS2一样,AS3也有一组绘图接口(drawing API),可以在影片(MC或者sprites)中动态地绘制矢量线条和图形.但在AS3中绘图接口不再像以前直接用于可见对象(Display Objects),而是单独定义为图形对象 (flash.display.Graphics). 图形对象拥有各种绘图方法用来在内部绘制图形。和以前相同的是,它被放置在目标对象的所有内容的下面,也就是说,在AS3中,你可以用新的函数更加方便的绘制矩形,圆形,甚至圆角矩形.这些函数包括:
drawCircle(x:Number, y:Number, radius:Number):void
drawEllipse(x:Number, y:Number, width:Number, height:Number):void drawRect(x:Number, y:Number, width:Number, height:Number):void drawRoundRect(x:Number, y:Number, width:Number, height:Number, ellipseWidth:Number,eHeight:Number):void
code:
//绘制一个蓝色的圆角矩形 var square:Sprite = new Sprite(); square.graphics.beginFill(0xFF0000);
square.graphics.drawRoundRect(0, 0, 100, 50, 10, 10); square.graphics.endFill(); addChild(square);
4.新的变量类型
as3 扩展了变量类型范围. 简单类型
Boolean int null Number String uint
2
undefined
复合类型
Object Array Date Error Function RegExp XML XMLList
另外还有一些分类到各个包中的诸如Matrix (flash.geom.Matrix), Shape (flash.display.Shape), URLRequest (flash.net.URLRequest),等等
一些提示 :Void 类型在 as3 中使用小写, Void改为 void
新增了万能类型 * 用来表示所有类型. 如果你没有为变量指定类型, 那么他即是默认类型var anyThing:*
XML 类型和 as1, 2 中的 XML不一样.通用的数据类型. as3 中的 XML 基于 E4X, 而不是象传统XML的解析接口一样, E4X使得XML成为通用的数据类型。E4X 简化操作XML将大大的减少相当 数量的代码以适用应用项目需要的发展。
新增 int 和 uint 简单类型来表示整数, 他们在数组遍历等不需要小数的场合相当有用. 在多数情况下int 类型会比使用 Number 快一点点, 而 uint 通常用来只用来表示颜值. 5.显示对象 (Display Object)
AS3中所有能在屏幕上看到的或者被添加到”显示列表”(display list)中对象组成了一个新的display objects的集合,它不仅仅包括以前AS的简单影片剪辑,按钮,和文本域这些对象,AS3还包括:
·AVM1Movie ·Bitmap ·Loader
·MorphShape* ·MovieClip ·Shape
·SimpleButton ·Sprite
·StaticText* ·TextField ·Video
后面加*的在时间轴上事先创建才能对它们操作,而且它们不能用AS直接创建.
AMV1Movie表示用AS1/2创建的影片,这些影片使用ActionScript Virtual Machine 1运行,而AS3影片用ActionScript Virtual Machine 2.AMV2也可以播放AVM1影片,但是AS3不能和AMV1
3
影片或者它们的脚本交互.
Bitmaps 位图对象.你可以用BitmapData对象来描绘图像,也可以用外部位图文件. Loader对象可以加载外部的图像或者SWF影片.
MorphShapes是时间线上创建的形状补间,尽管不能用AS创建MorphShapes,但是你可访问到时间轴上已经存在的MorphShapes.
MovieClips 还是以前那个你喜欢和了解的影片剪辑.
Shapes是被拆开的影片剪辑,它本质上只包括一个通过矢量绘图接口描绘图形的graphics对象.用Shapes来代替movieClips和sprites可以节约内存资源.Sprites本质上就是没有时间的影片剪辑.它是在AS3中最常用到的,你可以在自己的display object子类的时候继承它. StaticText和MorphShapes一样.不能用AS创建,只能手动创建. TextField包括动态文本和输入文本. Video 用来描述flash视频文件.
6.新的引入指令
AS3中的引人指令 和AS2有一点点的不同,在AS2中,import指令被单独用来表示定义在包中类的简写; 在使用类时不是必须用import指令的, 你完全可以仅仅直接使用类的全名来使用类.. code:
//ActionScript 2 此时可以不用import指令.
var myPoint:flash.geom.Point = new flash.geom.Point(0,0);
或者:
import flash.geom.Point;//此时用了import指令 var myPoint:Point=new Point(0,0);
在AS3中,访问类包中的类时,那怕是你使用了相关类的全名,也必须使用引入指令,当然不怕麻烦的话,你还可以像下面一样写了类的命名,也可以仅仅导入类的名称然后直接使用.但导入是必需的! code:
// ActionScript 3
import flash.geom.Point;
var myPoint:flash.geom.Point = new flash.geom.Point(0,0);
AS3中你同样可以像AS2一样用通配符(*)来导入一个包中的所有类.
import flash.geom.*;
相关资料: 类必须导入,即使是那些提及到类使用MyPackage.MyClass类,你必须导入MyPackage.*; 或者导入MyPackage.MyClass;这是必须的即使是那些提及到的类,列如使用全名MyPackage.MyClass。 在ActionScript 3.0中,被导入的文件表明你想使用来自于另一个
4
包的类,而在ActionScript 2.0中它只是一个简写。 在ActionScript 3.0中,完整的类名称用于消除模棱两可的情况,而且不会是导入文件方式的替代方式。
7.唯一的类量
在AS2中,类中定义的变量同时也被定义在类的prototype对象中.这样做虽然能很有效率的处理变量的定义,但是对于复杂的数据类型(例如数组)的定义来说有点问题,如果不在类的构造函数中为每个实例明确的定义,这些数据就可能会被”shared”,造成不便. AS3已经解决了这个问题,AS3中类中定义的变量对于每一个类的实例来说都是唯一的,所以这个问题不会发生了.
ActionScript Code:
class myClass{
private var list:Array = [1,2,3]; // bad for AS2, ok for AS3 public function myClass(){
// list should be defined here for AS2 } }
注:LUAR的一书中也提到了这个问题.P80 8.新的鼠标移动事件
在AS3中mouseMove事件有一点改变.以前,mouseMove事件不管鼠标在不在flash影片内,只要鼠标移动,Mouse对象或者MC的侦听器都会认为鼠标在移动并且接受这一事件.(MC不需要变为Mouse对象侦听器也可以动态接收鼠标事件).
而在AS3中,Mouse对象不再用来分派(dispatch)鼠标事件了.对于mouseMove事件,可以侦听Sprites,MovieClips和stage这些InteractiveObject实例获取,也就是AS3中使用InteractiveObject来侦听鼠标事件,不再是在Mouse对象上添加侦听器.mouseMove事件只有当鼠标从InteractiveObject实例的一个区域移动到它的另一个区域的时候才会调用,如果想让鼠标在影片的任何地方的移动都能被检测到,就需要侦听stage了.
当鼠标移动来拖动一个对象时,你需要使用stage来发送事件.因为如果用要拖动的对象做为事件发送器,当你的鼠标移出了拖动的对象,mouseMove事件就不在会被触发了,你的拖动也就停止了.
ActionScript Code:
stage.addEventListener(MouseEvent.MOUSE_MOVE,dragMyObject);
9. 类型转换和as运算符 10.delete关键词和类成员 11.Dictionary类 12.标签表达式
13.检测鼠标是否离开了影片
9.类型转换和as运算符
在必要的时候,AS充许把对象的类型转换为另一种合适的类型.不管是AS2还是AS3都支持使
5