从 ActionScript 2.0 迁移到 ActionScript 3.0:主要概念和变化.doc_第1页
从 ActionScript 2.0 迁移到 ActionScript 3.0:主要概念和变化.doc_第2页
从 ActionScript 2.0 迁移到 ActionScript 3.0:主要概念和变化.doc_第3页
从 ActionScript 2.0 迁移到 ActionScript 3.0:主要概念和变化.doc_第4页
从 ActionScript 2.0 迁移到 ActionScript 3.0:主要概念和变化.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文主要提供一些关键概念的总结, 以帮助你把你把应用程序迁移到ActionScript 3.0。在我刚刚开始使用ActionScript 3.0来创建程序的时候, 最困难的部份就是如何去适应那些我已经使用了多年的简单命令的改变。attachMovie 方法究竟跑到哪儿去了? MovieClip类里面的东西又去了哪? 这一切使我感到犹如要重新学习走路一样痛苦。 在过去的两年间, 我全情投入了ActionScript 3.0 SWF及Adobe AIR应用程序的开发工作。 我曾经欢笑, 曾经哭泣, 也曾经数次因为不愉快而击墙。 但到了最后, 我可以告诉你, 现在我真的很难去想象ActionScript 2.0的时代。 在一般层面上来说, ActionScript 3.0最大的优点就是所有东西都变得标准化。 这里只有一个方法去创建实例, 只有一个方法去处理事件。 如果你是刚刚开始学习ActionScript编程, 你可能要作更多的学习, 但它比以前变得同时更容易学习和上手了。 在本文中, 你将会找到有关ActionScript 3.0的改变的有关提示及注意事项, 其中包括以下几方面: 1. 处理影片剪辑组件 2. 处理事件 3. 加载数据, 内容及元件实例 4. 处理XML 5. 使用ActionScript 3.0来创建对象类 想要最有最有效地阅读本文, 你应该先对ActionScript 2.0及Adobe Flash CS4 Professional有一定程度的了解。 目录隐藏 1 处理影片剪辑组件 o 1.1 影片剪辑组件现在变成显示对象 o 1.2 巢式时间轴现在变成显示列表 o 1.3 实例的验证 o 1.4 影片剪辑组件属性的变化 o 1.5 this, _root, _parent和_global的使用 o 1.6 深度管理 o 1.7 绘图API的使用 2 处理事件 o 2.1 相同的事件处理方式 o 2.2 显示列表上的事件流 o 2.3 currentTarget和target事件属性的使用 3 加载数据,内容和元件实例 o 3.1 加载图片和swf o 3.2 加载服务器数据 o 3.3 准确加载元件 o 3.4 动态加载元件实例 o 3.5 加载URL 4 使用XML o 4.1 加载XML o 4.2 用ActionScript书写XML o 4.3 使用点语法来处理XMLList对象 o 4.4 不用循环来过滤XML o 4.5 获取XML属性 5 在ActionScript 3.0中构建对象 o 5.1 package关键字 o 5.2 新类的属性关键字 6 使用文档类 7 想了解更多 处理影片剪辑组件以下来这个章节将会描述在ActionScript 3.0中, 影片剪辑组件的一些重要变化。 影片剪辑组件现在变成显示对象在以前的ActionScript 版本中, 由于MovieClip对象包括了所有有关时间轴处理及可视化内容的命令, 使它成了所有事情的中心。 虽然MovieClip类用于控制内容是十分方便, 但它对于API的构造, 灵活性及细分都有着不少坏影响。 在ActionScript 3.0中, 最让我在意的就是MovieClip API的改进。 它不再包括很多我以前惯用的命令。 ActionScript 3.0语中的其中一个改善就是API细分的改变。 大多数主要的MovieClip API都已经移到DisplayObject和DisplayObjectContainer类之中, 而MovieClip类则从它们那里继承这些API。MovieClip API现在主要用来控制时间轴。 你需要仅记这个改变, 因为你可能会花上不少时间去寻找特定的命令。 以下是一些MovieClip类所继续的类的列表: MovieClip Sprite DisplayObjectContainer InteractiveObject DisplayObject EventDispatcher Object 注意MovieClip类是Sprite的子类。 Sprite其实就是一个没有时间轴的影片剪辑组件。 因为它不需要访问时间轴, 所以比MovieClip消耗更少资源, 建议用于创建可视化对象时使用。 想知道更多有关影片剪辑组件的功能的话, 请检阅继承链中每个类的有关文件。 巢式时间轴现在变成显示列表在ActionScript出现之前, 创建影片剪辑组件实例的巢式层级已经成为其中一部份。 在ActionScript首次演化的时候, 它对于代码中的影片剪辑组件及舞台上影片剪辑组件都作相同的处理。 但在ActionScript 3.0中, 发生了一些变化。 ActionScript 3.0的时间轴通过显示列表的概念来实现的。 对于每个加载到影片中的SWF, 显示列表都会有一个单一的stage跟root属性。 当影片剪辑组件及其他可视化对象在ActionScript中实例化的时候, 它们不会明确地分配到时间轴里。当你要动态创建影片剪辑组件的时候, 这个概念看起比较奇怪, 但它可以让你隐藏一个创建好的影片剪辑组件实例直到你想在显示列表中展示该实例。此外, 你可以在任何时间轴中显示你的新实例, 而无需限制于所实例化的时间轴当中。 当影片剪辑组件实例化的时候, 它们会成为显示对象。 当一个片剪辑组件实例跟显示列表产生关联的时候, 该片剪辑组件会被激活, 就如显示对象容器本身一样。 这意味着两个重点, 第1: 当片剪辑组件实例化并添加到显示列表的后, 它能够去显示及管理容器内的子实例。 第2: 在片剪辑组件实例添加到显示列表之前, 它是无法显示任何子级或对显示列表的stage或root属性进行存取。 在ActionScript 3.0中, 你可以通过使用addChild方法把一个显示对象在Stage上展示。 例如, 假设你想从库中创建一个ComboBox控件的实例, 然后在Stage上显示它, 你可以使用以下的代码: import fl.controls.ComboBox;var myCombo:ComboBox = new ComboBox();/ 这样会报错trace(myCombo.stage)/ 这样会正常工作addChild(myCombo);trace(myCombo.stage)上面所调用的addChild把myCombo实例添加到显示列表里。 在这个时候, myCombo实例会在Stage上显示, 其可以存取stage, root和parent这些属性。 值得注意的是, attachMovie方法已经被取代, 在这里我们会使用new这个关键词来创建myCombo的实例。 实例的验证当你尝试存取一个未定义的实例的时候, ActionScript 3.0会自动报错。 大多数情况下, 这是一种计时问题。 它常常发生于当你声明一个实例的变量引用, 但没有把一个对象实例化到该引用中, 然后添加到显示列表中的情况下。 要去验证显示列表中的未定义实例, 可以使用getChildByName方法, 代码如下: var myInstance:MovieClip = getChildByName(instanceNameInQuestion);if( myInstance!= null ) / 执行一些工作.以上的代码通过使用实例名称来验证它是否存在于显示列表当中。 如果结果为 null, 如下的动作不会被执行, 而且也不会报错。 你也可以使用try.catch语句来防止播放器可能因为预期外的错误而停止运作。 影片剪辑组件属性的变化在ActionScript 3.0中, 属性名称中的底线符号(_)已经消失了。 在个别例子中, 一些公共属性值的设置方法也发生了变化。 影片剪辑组件的alpha属性的设置范围从0到100变成0到1。 比如, 50%的透明度可以这样设置: myInstance.alpha = 0.5;显示对象中的scaleX和scaleY属性的设置方法大致相同。 例如, 150%的比例可以这样设置: myInstance.scaleX = 1.5;myInstance.scaleY = 1.5;this, _root, _parent和_global的使用this这个关键词可以在ActionScript 3.0中继续使用, 它的功能跟前一版的ActionScript语言一样。 _global路径不再存在于ActionScript 3.0中。 如果你需要在ActionScript 3.0中使用全局引用, 可以创建一个带有静态属性的类。 _parent属性可以用来存取任何已经添加到显示列表中的显示对象的父级属性。 _root属性现在是相对于影片中每个所加载的SWF, 当任何已经添加到显示列表中的显示对象的 root属性来存取。 stage属性的使用方法跟_root属性大致上相同, 它可以用于任何已经添加到显示列表中的显示对象。 深度管理swapDepths和getNextHighestDepth方法已经不存在于 ActionScript 3.0中。 取而代之, 你会使用DisplayObjectContainer里的方法, 它们适用于那些添加到显示列表的影片剪辑组件中。 在ActionScript 3.0的子对象列表中, 我们会称其为显示对象的index(索引)而非depth(深度)。 例如1, 要把一个命名为myInstance的影片移到堆垛的顶部, 代码如下: setChildIndex(myInstance, numChildren - 1);绘图API的使用正如MovieClip API的变化一样, 绘图API已经移到显示对象的graphics属性下。 除了位置改变了之外, 它的使用方法跟之前一样, 还附带了一些改进之处。 比如drawRect和drawEllipse这个快捷的命令, 就是我的喜好之一。 以下代码展示如何动态地绘制一个正方形, 然后把它作为一个屏蔽应用到另一个实例中。 这个屏蔽没有时间轴, 所以应以sprite类来创建: import flash.display.Sprite;/ 创建屏蔽var maskArea:Sprite = new Sprite();maskArea.graphics.beginFill(0xFF0000);maskArea.graphics.drawRect(-29.5, -22.5, 59, 46);addChild(maskArea);/ 应用屏蔽myInstance.mask = maskArea;处理事件本章节将会重点描述ActionScript 3.0中的标准事件处理模型。 相同的事件处理方式ActionScript 3.0中的事件已经大幅地革新, ActionScript 2.0中常用的事件处理手法已经成为ActionScript 3.0中所有显示对象的一部分。 大体上来说, ActionScript语言中的对象现在会采用相同的事件模型。 在ActionScript 3.0的标准化进程中, 事件处理函数的作用也发生了一些变化。 在新的事件模型中, addEventListener方法需要的是监听器的函数引用, 而非对象本身或函数引用。 在ActionScript 2.0中, 一个对象常常会在多个事件处理函数中作为容器来使用; 而在 ActionScript 3.0里, 监听器会变成个别事件或在包含switch语包以处理多个事件的函数。 以下代码展示如何将一个鼠标处理函数分配到一个按钮中: import flash.events.MouseEvent;function clickHandler(event:MouseEvent):void / 在这里处理事件.my_btn.addEventListener(MouseEvent.CLICK, clickHandler);以上代码首先从MouseEvent类之中加载数据类型。clickHandler是一个事件处理函数, 用来对事件通告作出响应。 addEventListener方法把该事件处理函数跟用以广播事件的对象进行链接。 显示列表上的事件流显示列表上的可视对象的事件会经由该列表流向目标对象。 这种事件传递包括3个阶段, 它们允许目标外的对象去进行事件接收。 例如, 假设一个主时间轴上的影片剪辑中的按钮。 如果你点击它, CLICK事件会经由该影片剪辑从Stage流向按钮中。这种结构使你可以把监听器放置到按钮(从按钮中接收事件)或影片剪辑容器本身(从容器内的任何按钮中接收事件)。 此外, 你也可以把监听器放置在Stage上面, 这样子就可以接收影片中的任何CLICK事件。 这种事件监听方法展现事件流处理的多种可能性。 在建立用来存取显示列表的初始化代码时, 你可以通过ADDED_TO_STAGE事件来确保初始化的时间。 代码如下: import flash.event.Event;function adddedToStageHandler(event:Event):void / 代码初始化放在这里.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);请仅记, 在对象初始化后, 你无需立刻把它添加到显示列表。 通过以上的代码, 你可以对Stage进行准确的初始化。 currentTarget和target事件属性的使用事件处理函数会接收包含与事件相关数据的事件对象。 在ActionScript 2.0 的组件事件架构中, 你可以通过 target属性来对事件广播的对象进行引用。 在ActionScript 3.0中, 事件对象的target属性将不能引用该对象本身。 我发现如果把我的监听器直接分配到目标对象中并使用currentTarget事件属性会比较可靠, 例如: import flash.events.MouseEvent;function clickHandler(event:MouseEvent):void / 在点击时执行. switch(event.currentTarget) case my_btn1: / 执行工作. Break; case my_btn2: / 执行工作. Break; case my_btn3: / 执行工作. Break; my_btn1.addEventListener(MouseEvent.CLICK, clickHandler);my_btn2.addEventListener(MouseEvent.CLICK, clickHandler);my_btn3.addEventListener(MouseEvent.CLICK, clickHandler);如果你想用target属性来取代currentTarget属性的话, 一定要注意那些跟addEventListener相关的额外参数。我发现有些情况下, ActionScript 3.0的target属性会为空值, 这是因为事件系统在引用被传递到我的事件函数之前, 该引用已经被删取了。 为了解决这个问题, 我通过修改addEventListener方法的可选参数, 对回收机制的设置进行一些修改。 代码如下: import flash.events.MouseEvent;function clickHandler(event:MouseEvent):void / 在点击时执行. switch(event.target) case my_btn1: / 执行工作. Break; case my_btn2: / 执行工作. Break; case my_btn3: / 执行工作. Break; addEventListener(MouseEvent.CLICK,clickHandler,false,0,true);最后那个参数就是useWeakReference(使用弱引用), 在代码中它被设置为true。 一个强引用会阻止监听器被强制回收。 因此, 通过设置该参数为false, 可以使到事件系统不对事件目标的引用进行强制回收。 加载数据,内容和元件实例以下内容包括:图片的加载,服务端数据的加载,实例和URL的加载。 加载图片和swf 图片和swf的加载不再会使用loadMovie方法 和MovieClipLoader 类。取而代之的是URLRequest 和Loader 类,他们可以实现同样的功能。 最基本的加载图片的脚本如以下代码所示: import flash.display.Loader;import .URLRequest;var request:URLRequest = new URLRequest(img/image1.jpg);var loader:Loader = new Loader();loader.load(request);addChild(loader);加载服务器数据 下面的例子描绘了一个请求服务端脚本的过程并抛出数据加载完毕事件。 import flash.display.URLLoader;import .URLRequest;import flash.events.Event;var loader:URLLoader = new URLLoader(); loader.load(new URLRequest(/cgi/get_text.php);function onDataHandler(event:Event):void var result:String = String(loader.data); / 添加你自己的逻辑在这里.loader.addEventListener(Event.COMPLETE, onDataHandler);这段代码请求了一个服务器脚本,然后通过使用URLLoader的COMPLETE 事件,捕获了返回的数据。 准确加载元件 ActionScript 3.0里面已经没有attachMovie 方法和连接标识符了,取而代之的是你需要用一两条语句把库里的元件附加进来。对于任何一种渠道,你都需要选中该元件元件属性对话框中的“为action导出”,然后在Class(类)的输入框中输入类名。 元件名和类名都明确了,就可以用以下代码: var myInstance = new MyClassName();addChild(myInstance); 注意:所有的实例都要用ActionScript 3.0的new关键字创建。 动态加载元件实例 使用new关键字很方便,而且是很正规的书写的方式。但它只适用于明确了要实例化的类的名称的时候。构建模板时,我总是发现我要实例化的类名已经为XML字符串或某种命名规范所用了。在这种情况下,我就用UILoader类来动态创建元件实例。 如果你不是很明确类名的话,你可以用以下步骤: import fl.containers.UILoader;/ Load an instance dynamicallyvar myInstance:UILoader = new UILoader();myInstance.scaleContent = false;myInstance.source = myClassName;addChild(myInstance); 注意: 如果只是加载display对象,例如图片和 movie clips,这段代码才有用;如果是音频或是库,那仍然需要知道确切的类名。 加载URL getURL方法在ActionScript 3.0中已不复存在,要请求一个URL,你需要创建一个URLRequest 实例,然后调用navigateToUrl 方法,ActionScript 3.0的错误处理通过下面的try.catch表达式实现 。 import .*;var url:String = ;var request:URLRequest = new URLRequest(url);try navigateToURL(request);catch (e:Error) / Handle error. 注意,脚本中引用到的包包含了URLRequest类和navigateToURL方法。try.catch语句可以用来处理URL加载失败的错误。 使用XML 以下部分将包括在ActionScript 3.0里使用XML。 加载XML XML类不再会拥有加载的功能。它仅用来处理XML架构。要加载XML,同样需要用URLReqest和URLLoader类来请求服务端脚本。 以下的代码描绘了加载XML文件并在数据加载完毕后返回事件的方法: import flash.display.URLLoader;import .URLRequest;import flash.events.Event;var loader = new URLLoader();loader.load(new URLRequest(conf/settings.xml);function onDataHandler(event:Event):void if(event.target as URLLoader)!= null ) var settingsXML = new XML(loader.data); loader.addEventListener(Event.COMPLETE, onDataHandler); 注意上方在事件处理时使用的as关键字。在ActionScript 3.0中,as关键字用来检测两个对象的类型是否一致。也可以用来把对象投射成相应的数据类型。这样就能很方便地处理需要关联数据类型的对象,或用来检测数据类型是否一致。以上面的代码为例,你可以通过使用as关键字来检测event.target是否是URLLoader类型。如果不关联,那就它就不是URLLoader。这种验证可以很好地避免运行时的错误。 用ActionScript书写XML ActionScript 3.0的又一大功能是可以直接用ActionScript书写XML。 下面的例子用ActionScript书写了一个包含XML内容的变量。 var books:XML = Book 1 Author 1 Book 2 Author 2 使用点语法来处理XMLList对象相较于ActionScript 2.0,ActionScript 3.0的XML类更好用。你可以像用一个标准对象的属性一样来获取节点。方便地通过使用点符号和XMLList方法来获取信息。XMLList是个新类,它囊括了一个节点的子集。从某种角度来说,它比标准的array更好用。 下面的例子描述了对books这个XML中,book XMLList的循环。 for each(var elem in books.book) trace(Author: +elem.author+, Title: +elem.title);不用循环来过滤XML ActionScript 3.0的另一大处理XML的功能是可以不用循环就可以过滤XMLList对象。你可以在XML句柄增加表达式,让Adobe Flash Player来做处理。 下面的代码会告诉你如何过滤XMLList,从中获取属性category值是2的节点,并返回一个新的XMLList。 var filteredList:XMLList = books.book.(category=2);注意用来获取节点属性值的操作符,和用来过滤结果的条件表达式。 获取XML属性 新的XML语法比以前更好用。但得注意的是节点的内容不一定只是String类型,如果是根据条件复制或比较数据得来的,那就会出现问题。所以你需要把节点值转化为String类型,也可以用text方法。 下面的代码返回了第二本书的作者的string类型。 var author2:String = books.book1.author.text();在ActionScript 3.0中构建对象 下面的章节介绍了package关键字和ActionScript语言使用上的主要变化。 package关键字 ActionScrip

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论