白桦的天空

第一次的心动,永远的心痛!
  首页  :: 新随笔  :: 联系 :: 管理

Adobe Flash CS3 Professional 引入了很多优秀的新功能, 包括 ActionScript 3.0 编程语言和 ActionScript 3.0 FLA 文件格式。 本文是我转向使用 ActionScript 3.0 的过程中注解和反思的总结。 我还提供了以下问题的解决方案:

  • 关于影片剪辑处理的更改
  • 关于下载数据、内容和元件的更改
  • 关于 ActionScript 3.0 中构建对象类的更改

关于影片剪辑处理的更改

以下注解解决如何处理影片剪辑的问题:

1. 显示对象与影片剪辑

我在 ActionScript 3.0 注意到的第一个地方就是 MovieClip API。 在 ActionScript 3.0 中, MovieClip API 不再包含我经常使用的多数命令。 我发现有一个新的模型用于画面对象, 其中影片剪辑作为画面对象容器, 为便于控制保留了注册项列表。 MovieClip API 现在主要用于反转时间轴。

在 ActionScript 3.0 中, 可以使用 addChild 方法查看显示在舞台上的画面对象。 例如, 假设您要从“库”创建“组合框”组件的实例。 要查看显示在舞台上的实例, 您需要编写以下代码:

import fl.controls.ComboBox;
 
var myCombo:ComboBox = new ComboBox();
addChild(myCombo);

2. 实例验证

我发现了 ActionScript 3.0 类中处理实例方式的一些不同之处。 在创作期间置于舞台的实例自动将其实例名称与其影片剪辑容器关联, 名称在 ActionScript 3.0 类中可用。 像在 ActionScript 2.0 中一样在类中声明名称会触发编译器错误。 反过来, 我也发现当针对不存在的实例设置属性时, 编译器也会报告错误。

要验证未定义的实例, 请使用 getChildByName 方法, 如以下代码所示:

var myInstance = getChildByName("instanceNameInQuestion");
if( myInstance!= null )
{
   // Then do something...
}

3. 影片剪辑 (画面对象) 属性更改

在 ActionScript 3.0 中, 下划线 (_) 已从属性名称中去掉。 在某些情况下, 为常用属性设计值的主要也已更新。

影片剪辑的 alpha 属性现在的设置范围为 0-1 而不是 0-100。 例如, 50% 不透明应设置为:

myInstance.alpha = 0.5;

画面对象的 scaleXscaleY 属性现在以类似方式设置。 例如, 150% 正常缩放应设置为:

myInstance.scaleX = 1.5;
myInstance.scaleY = 1.5;

4. this, _root, _parent, and _global

this 别名可用于 ActionScript 3.0 中, 其行为与 ActionScript 的先前版本一样。 _global 路径在 ActionScript 3.0 中不存在。 _parent 可作为任何画面对象的属性来访问。 _root 路径不再存在, 但使用舞台属性可以产生同样的结果。

5. 处理深度

我很快发现, swapDepthsgetNextHighestDepth 在 ActionScript 3.0 不复存在。 作为替代, 您要使用与影片剪辑容器关联的 DisplayObjectContainer 方法。 ActionScript 3.0 中的术语基于子对象列表中的画面对象“索引”, 而不是“深度”概念。

要将 myInstance 剪辑发送以堆序列的顶部, 请使用以下代码:

setChildIndex(myInstance, numChildren - 1);

6. 使用 Drawing API

与 MovieClip API 的其他更改一样, 动态 Drawing API 已移动到画面对象的图形属性。 除新位置外, 其使用过程相同 - 有几处明显的增强。

以下代码显示如何动态画出矩形, 然后将此矩形作为遮罩应用到其他实例。 遮罩对象没有时间轴, 因此作为子画面而不是影片剪辑来创建:

import flash.display.Sprite;
 
// Create mask
var maskArea = new Sprite();
maskArea.graphics.beginFill(0xFF0000);
maskArea.graphics.drawRect(-29.5, -22.5, 59, 46);
addChild(maskArea);
          
// Apply mask
myInstance.mask = maskArea;

注: 在考查以前与 MovieClip 对象关联的常用任务时, 请尝试在浏览 ActionScript 3.0 对象时考查 DisplayObject 类。 有关深度控制和画面对象管理的更多信息, 请参见文档中关于 DisplayObjectContainer 类的说明。

关于下载数据、内容和元件的更改

以下注解针对载入图像、服务器数据、元件和 URL 的载入:

7. 载入图像和 SWF

图像和 SWF 文件的载入不再通过 loadMovie 命令或 MovieClipLoader 类进行。 而是使用 URLRequest 类和 Loader 类来完成此任务。

以下代码显示图像载入器脚本的骨架:

import flash.display.Loader;
import flash.net.URLRequest;
 
var request:URLRequest = new URLRequest("img/image1.jpg");
var loader:Loader = new Loader();
loader.load(request);
addChild(loader);

8. 载入服务器数据和 XML

使用新的 ActionScript 3.0 XML 功能和新的 URLLoader 类, 我发现 XML 数据源的使用比以前容易得多。

以下示例显示如何载入 XML 文件并响应数据载入过程的完成:

import flash.display.URLLoader;
import flash.net.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);

9. 显式载入元件

attachMovie 命令和链接标识符在 ActionScript 3.0 中不复存在。 有两种方法从库载入元件。 两种方法都需要您为目标元件打开“链接”属性中的“为 ActionScript 导入”选项。 由于您不再添加标识符, 必须使用类名称处理所有内容。 如果要附加的元件没有自定义类, 请使用默认情况下插入的元件名称。 这种情况下, Flash 使用元件的名称为您创建一个骨架类。 在“链接”属性中设置类名称后, 您将必须确定类名称是显式已知还是动态提供。

当类名称与显示已知的元件关联时, 使用以下代码方案:

var myInstance = new MyClassName();
addChild(myInstance);

注: 所有实例均使用 ActionScript 3.0 中的新关键字创建。

10. 动态载入元件

使用新关键字非常容易, 也是一种不错的脚本约定, 但仅适用于显示知道待实例化类的名称这种情况。 在构建模板时, 我发现我在尝试实例化一个类的位置, 该类的名称通过 XML 字符串动态提供或使用某种命名约定。 在这些情况下, 我使用为动态创建元件实例发现的第二种解决方案。

当类的名称不是显式已知时, 使用 UILoader 类, 如以下代码所示:

import fl.containers.UILoader;
 
// Attach movie
var myInstance = new UILoader();
myInstance.scaleContent = false;
myInstance.source = "myClassName";;
addChild(myInstance);

11. 载入 URL

getURL 命令在 ActionScript 3.0 中不复存在。 要调用 URL, 需要创建一个 URLRequest 实例, 然后调用 navigateToUrl 方法。 以下 try 声明显示 ActionScript 3.0 异常处理的错误处理类型; 它显示如何调用 URL:

import flash.net.*;
 
var url = "";
var request:URLRequest = new URLRequest(url);
try {          
   navigateToURL(request);
}
catch (e:Error) {
   // Handle error...
}

关于 ActionScript 3.0 中构建对象类的更改

以下注解针对 package 关键字、数据类型设置与类型检查、关于事件处理的更改, 可保证填充事件的对象属性:

12. package 关键字

ActionScript 3.0 类的结构与 ActionScript 2.0 类区别不大。 也许, 最大的结构区别在于使用 package 关键字启动 ActionScript 3.0 文件。

如果类 (myClass) 保存到名为 myCode 的文件夹中, 则类文件的结构类似于:

package myCode
{
   import flash.display.MovieClip;
 
   public class myClass extends MovieClip
   {
      function myClass(){
         // write out class as usual from here...
      }
   }
}

13. 数据类型确定与类型检查

ActionScript 3.0 包含一些新的运算符, 可用于数据类型确定、类型检查和类型转换。 当我使用事件或扫描画面对象以查找特定类型时, 我发现这些运算符非常有用。

要在编译器认为实例不是影片剪辑而将其转换为影片剪辑, 请使用 as 关键字, 如下所示:

(loader.content as MovieClip).play();

要检查对象是否为特定类型的类, 请使用 is 关键字, 如下所示:

if( myInstance is myClass )
{
   // do something...
}

注: is 运算符替代 ActionScript 以前版本中的 instanceof 运算符。

14. 关于事件处理的更改

在 ActionScript 3.0 中, 事件有了新的发展。 格式对比以前的版本有很大的区别, 但语法变化很小。 在对象实例中封装事件句柄函数不再被认为是最佳实践。

以下代码显示如何将鼠标句柄指派给按钮:

import flash.events.MouseEvent;
function clickHandler(event:MouseEvent):void
{
   // Handle event here...
}
addEventListener(MouseEvent.CLICK, clickHandler);

15. 确保事件的目标属性已填充

我发现, 在 ActionScript 3.0 中创建自定义控件非常容易。 但是, 在通过自定义控件侦听事件时遇到了问题。 在开发应用程序时, 我经常在一个事件句柄函数中处理来自多个组件的事件。 我还经常将事件对象的目标属性作为一种引用方式, 向回引用播放事件的对象。 我遇到的问题起因于事件对象的目标属性作为空值到达事件句柄函数。 由于我无法向回引用原始对象, 我设置动态环境非常困难。

通过 Flash 用户界面组件代码适当深入挖掘后, 我发现还其他参数与 addEventListener 命令关联。 我发布了目标属性为空的原因: 事件系统在将目标引用发送到我的事件句柄时删除了此引用。 解决此问题的方法就是通过调整显示在 addEventListener 命令末尾的可选参数来更改不适当的设置组。

我将以下代码放入自定义按钮控件, 以确保事件的目标属性保持填充状态:

import flash.events.MouseEvent;
function clickHandler(event:MouseEvent):void
{
   // Do something on click...
}
addEventListener(MouseEvent.CLICK,clickHandler,false,0,true);

请注意, 最后一个参数设置为 true。 这就是导致事件系统将引用留给事件目标的设置。

下一步工作

这些是我学习 ActionScript 3.0 时注意到的最重要的几个问题。 有关更多信息, 请访问开发人员中心的 ActionScript 技术中心*

有关从 ActionScript 2.0 转到 ActionScript 3.0 的完整信息, 另请参见 ActionScript 2.0 Migration reference*