Flash Designer中的AS3组件

时间:2008-11-26 22:20:47

标签: flash actionscript-3 actionscript

在ActionScript 2项目中,我可以创建一个新的MovieClip,在库上右键单击它,然后选择“组件定义”以添加可在MovieClip中引用的参数。可以在MovieClips的属性中轻松更改此参数。

现在,我正在开发一个ActionScript 3项目,但却无法找到获取这些参数中传递的值的方法。

我定义了一个名为“textToDisplay”的参数,但是当我在第一帧的Actions中写下以下内容时出现错误:

trace(textToDisplay);

这是错误:

1120: Access of undefined property textToDisplay.

您知道如何捕获该参数的值吗?

由于

PS:我在Windows XP上使用Adobe Flash CS3 Professional

8 个答案:

答案 0 :(得分:4)

考虑到找到有关自定义组件设置的信息有多难,我想我会根据自己的经验清理流程的某些方面。

INIT EVENT:

在大多数情况下,上面的aaaidan示例是正确的,只有一个例外。

addEventListener(Event.INIT, onInit);

应该是:

loaderInfo.addEventListener(Event.INIT, onInit);

DisplayObject的loaderInfo属性引用一个LoaderInfo,组件从中获取其参数设置。获取其数据时调用INIT事件(或者可以使用COMPLETE事件,该事件应该在INIT之后直接触发)

INSPECTABLEABLE METADATA:

当您使用元数据[Inspectable]标签设置要访问的属性时,您还可以使用以下方法定义默认值:

 [Inspectable(defaultValue="whatevervalue")]

根据我的经验,参数似乎在处理除字符串之外的任何事情(可能还有数字)时遇到问题,所以我建议使用带有字符串值的set函数并使用它们来获取您可能想要的其他值。例如,如果要加载特定命名类的新实例

 [Inspectable(defaultValue="flash.display.Sprite")]
public function set className(value:String):void{
       var ClassReference:Class = getDefinitionByName(value) as Class;
       _class = new ClassReference();
}

在此示例中,如果参数设置为“flash.display.Sprite”,则调用“new _class()将创建一个新的Sprite实例。

设置功能:

如果您希望自定义组件以其他方式调整大小,只需拉伸高度和宽度值,则需要公共setSize函数。每次在闪存中调整组件大小时都会调用此函数。

public function setSize(w:Number, h:Number):void{
   _menuWidth = w;
   _menuHeight = h;
}

现在当你在flash中调整组件大小时这很有用但是一旦你实际发布你的swf文件,你会发现它切换回拉伸宽度和高度而不是使用你的setSize函数(我不知道为什么,但那就是它的作用) )。为了解决这个问题,你需要在onInit函数中获取宽度和高度,将它们输入setSize,然后将scaleX和scaleY值重置为1:

public function onInit(e:Event):void{
   setSize(width,height);
   scaleX = 1;
   scaleY = 1;
   //add other functions that need to be run once the parameters are loaded
}

(如果有人发现这样做的方法不那么混乱,请告知)

希望这有助于某人启动并运行自定义组件。

答案 1 :(得分:2)

最后让它工作(使用基本的MovieClip到目前为止没有太多扩展)。我有两个要添加的内容:

  1. 需要为ActionScript导出符号(即具有链接定义)。仅在组件定义中设置类不起作用。如果没有导出设置,则会解释[Inspectable]标记,但完全忽略其余代码。甚至是类的构造函数中的东西。
  2. [Inspectable]标记中的默认值在编译时似乎不起作用,或者更确切地说会导致null。我只在组件参数框中使用了一个字符串,但是跟踪了null。即使在Event.INIT之后(我正在跟踪点击)。它似乎不是“值未结转”的情况,因为手动输入默认值仍将导致null。在[Inspectable]中设置默认值可以有效地定义无法使用的值。
  3. P.S。使用CS5。

答案 2 :(得分:1)

在as3中,您必须创建一个包含一个或多个public var声明的外部类文件(您还可以使用公共get / set函数)。谷歌,如果你不确定如何。

在您的外部文件中,使用[Inspectable]之前的var元数据标记,如下所示:

package myPackage {
  import flash.display.MovieClip;

  public class MyComponent extends MovieClip {

    [Inspectable]
    public var myFancyComponentParameter:String;

    [Inspectable]
    public var myOtherFancyComponentParameter:int;

  }

}

然后,您可以打开“组件定义”对话框,将“类”字段设置为外部类的名称(包括包名称),Flash将根据您的[Inspectable]标记自动为组件创建参数。或者您可以手动创建它们。

完成此设置后,您可以在时间轴代码中访问组件变量:

trace("Here's my var: " + myFancyComponentParameter);

[Inspectable]标记(包括数据类型)的详细信息,请访问metadata livedocs

如果您希望外部类除了保持组件值之外还执行任何操作,那么在链接对话框中设置类名也是一个好主意。

我还建议将代码放在外部类中,而不是放在时间轴中。这种方式更具扩展性。如果这样做,请记住在触发INIT事件之后才会设置组件参数。以下是如何倾听:

// package and import statements omitted for brevity
public class MyComponent extends MovieClip {

  [Inspectable]
  public var myFancyComponentParameter:String;

  public function MyComponent() {
    // myFancyComponentParameter not set here yet
    trace(myFancyComponentParameter); // prints null
    addEventListener(Event.INIT, onInit);
  }

  public function onInit(e:Event) {
    // now we can use component parameters!
    trace(myFancyComponentParameter); // prints the param value
  }

}

答案 3 :(得分:0)

我没有使用过这个特定的功能,但是您可能需要为该MovieClip定义一个自定义类(只是子类MovieClip)并添加该额外变量。 Actionscript 3已经摆脱了动作脚本2的动态特性,这可能有点令人困惑,但最终它更加强大。

答案 4 :(得分:0)

我没有在MovieClip类定义中看到INIT事件,似乎没有调用它。

答案 5 :(得分:0)

我遇到了同样的问题 - MovieClip没有INIT事件 - 但是否则这个解决方案工作正常。我能看到解决这个问题的唯一方法是使用Event.ENTER_FRAME并在第一次调用处理程序时再次删除侦听器。我的组件参数可以从下一帧开始访问,但我发现在实例化影片剪辑时没有正式事件令人惊讶。

答案 6 :(得分:0)

有一个ADDED_TO_STAGE事件比steve-mann建议的ENTER_FRAME事件更好。

答案 7 :(得分:0)

在CS4 10.0.2版本中,您可以再次右键单击并手动添加组件参数。

有两点需要注意:

  1. 在引用自定义值之前,您仍需要等待loaderInfo Event.INIT(即:loaderInfo.addEventListener(Event.INIT,initComponent)
  2. 您需要在第1帧(var paramName)上定义参数,以便能够在没有编译器错误的情况下引用它。
  3. 希望这有助于你......我知道它对我有所帮助!

    〜格雷格