原文:http://www.kirupa.com/forum/showthread.php?p=1876826因为英语水平和AS水平不足的原因,难免会出来错误.望指正. thx…..慢慢来,还有很多……
1.改变影片的帧频
2.类方法的作用域和类绑定
3.Graphics对象和绘图接口(API)
4.新的变量类型
5.显示对象
6.新的引入指令
7.唯一的类变量
8.新的鼠标移动事件
1. 改变影片的帧频
在AS3中,充许通过Stage类动态地改变影片的帧频.
每一个Sprite或者MovieClip实例都有一个stage属性,这个属性关联到一个Stage对象.可以通设置Stage对象的frameRate属性的值来调整影片播放时的帧频.frameRate值的大小范围为0.01至1000.
stage . frameRate = 12 ;
2.类方法的作用域和类绑定
ActionScript 3 是完全基于类的,当你创建了一个类的时候,你也创建了与这个类相关的变量和函数(方法)以及类的实例,和ActionScript 2不同的是,ActionScript 3.0 中的方法类在的范围内调用. 即使函数被绑定给其它对象,然后通过这个对象调用函数,这个函数的调用范围仍然是函数所在的类,和Function.call和Function.applye用法一样.
import flash . display . Sprite ;
public class ClassScope extends Sprite {
public function ClassScope () {
traceThis () ; // "Class Instance"
var obj : Object = new Object () ;
obj . traceThis = traceThis ;
obj . traceThis () ; // "Class Instance"
traceThis . call ( new Sprite ()) ; // "Class Instance"
}
public override function toString () : String {
return " Class Instance " ;
}
public function traceThis () : void {
trace ( this ) ;
}
}
}
注:as2时代常用的Delegate可以不用了。更不用麻烦的使用下面的方法了,
function clickHandler () : Void
{
//do something..
owner . someMethod () ;
}
3.Graphics对象和绘图接口(API)
和AS1和AS2一样,AS3也有一组绘图接口(drawing API),可以在影片(MC或者sprites)中动态地绘制矢量线条和图形.但在AS3中绘图接口不再像以前直接用于可见对象(Display Objects),而是单独定义为图形对象 (flash.display.Graphics). 图形对象拥有各种绘图方法用来在内部绘制图形。和以前相同的是,它被放置在目标对象的所有内容的下面,也就是说,在AS3中,你可以用新的函数更加方便的绘制矩形,圆形,甚至圆角矩形.这些函数包括:
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 ( 0 xFF0000 ) ;
square . graphics . drawRoundRect ( 0 , 0 , 100 , 50 , 10 , 10 ) ;
square . graphics . endFill () ;
addChild ( square ) ;
4.新的变量类型
as3 扩展了变量类型范围.
简单类型
int
null
Number
String
uint
undefined
复合类型
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还包括:
· 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影片或者它们的脚本交互.
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:
var myPoint : flash . geom . Point = new flash . geom . Point ( 0 , 0 ) ;
或者:
var myPoint : Point = new Point ( 0 , 0 ) ;
在AS3中,访问类包中的类时,那怕是你使用了相关类的全名,也必须使用引入指令,当然不怕麻烦的话,你还可以像下面一样写了类的命名,也可以仅仅导入类的名称然后直接使用.但导入是必需的!
code:
import flash . geom . Point ;
var myPoint : flash . geom . Point = new flash . geom . Point ( 0 , 0 ) ;
AS3中你同样可以像AS2一样用通配符(*)来导入一个包中的所有类.
相关资料: 类必须导入,即使是那些提及到类使用MyPackage.MyClass类,你必须导入MyPackage.*; 或者导入MyPackage.MyClass;这是必须的即使是那些提及到的类,列如使用全名MyPackage.MyClass。 在ActionScript 3.0中,被导入的文件表明你想使用来自于另一个包的类,而在ActionScript 2.0中它只是一个简写。 在ActionScript 3.0中,完整的类名称用于消除模棱两可的情况,而且不会是导入文件方式的替代方式。
7.唯一的类量
在AS2中,类中定义的变量同时也被定义在类的prototype对象中.这样做虽然能很有效率的处理变量的定义,但是对于复杂的数据类型(例如数组)的定义来说有点问题,如果不在类的构造函数中为每个实例明确的定义,这些数据就可能会被”shared”,造成不便. AS3已经解决了这个问题,AS3中类中定义的变量对于每一个类的实例来说都是唯一的,所以这个问题不会发生了.
ActionScript Code:
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: