从Flash CS到Flex Builder

时间:2012-06-05 16:56:10

标签: actionscript-3 flash flex

我正在尝试将我的纯ActionScript Flash项目移植到Flex Builder。

我创建了一个新项目,它打开了一个mxml文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
        ]]>
    </fx:Script>
</s:Application>

现在,我正在尝试复制这个mxml文件中的Flash文档类,但无济于事。

如果我在内部添加fx:脚本以下代码:

        addChild(new TradeShow());

我明白了:

  

1180:调用可能未定义的方法addChild。

好的,因此mxml没有隐式的DisplayObjectContainer。让我们尝试定义一个(总是在fx:Script里面):

        public class TradeShow extends Sprite {}

这是另一个矛盾的错误:

  

1131:不得嵌套类。

我已经失去了几个小时并且多次羞愧自己。有人可以在这里点亮一些光吗?

5 个答案:

答案 0 :(得分:2)

  

我创建了一个新项目,它会打开一个像这样的

这样的mxml文件

听起来您在Flash Builder中创建了一个Flex项目。除非您想要移植Flash Pro ActionScript项目以使用Flex Framework,否则我强烈建议您在Flash Builder中创建一个ActionScript项目。

我怀疑这会解决你的大多数问题。


我正在编辑以添加有关Flex及其工作原理的更多信息。

  

如果我在内部添加fx:脚本以下代码:

    addChild(new TradeShow());
     

我明白了:

1180: Call to a possibly undefined method addChild.

我不太确定你为什么会收到这个错误;但是fx:Script块中的代码必须位于方法,import语句或变量定义中。这与你写的“普通”课程并没有什么不同。将MXML文件视为一个类;刚刚定义不同。 Flex编译器在引擎盖下生成MXML。应将MXML视为ActionScript代码生成语言。

  

好的,所以mxml没有隐式的DisplayObjectContainer。

事实并非如此。 Application类扩展了UIComponent - 与所有Flex可视类一样,它在术语中扩展了DisplayObjectContainer。因此,Application类是DisplayObjectContainer。我怀疑上述错误的原因是代码的位置。

Let's try to define one (always inside fx:Script):

        public class TradeShow extends Sprite {}

Here is another contradicting error :

    1131: Classes must not be nested.

在我看来,这并不矛盾。应用程序是一个类。而你正在尝试在其中定义一个新的。这在仅适用于ActionScript的类中不起作用,并且在MXML类中不起作用。

如果您真的想使用Flex,那么您应该阅读Flex Component LifeCycle。以下是MX Component LifeCycle,此处是Spark Component Lifecycle的信息。

答案 1 :(得分:2)

您甚至可以在Flash Builder中创建Flash Professional项目,并使用Flash Builder界面构建代码,您可以通过Flash Builder和Flash Professional编译swf。

这是开发具有带资产的FLA文件的项目的一种很好的方式。

答案 2 :(得分:1)

是的...... Flex有点不同。我不会乱用类文件(甚至认为我应该)所以我不能评论,但为了让addChild工作,只需这样做:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="init()">
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
    <![CDATA[

    private function init():void
    {
        this.addChild(new TradeShow());
    }

    ]]>
</fx:Script>
</s:Application>

在主应用程序标签中添加了“creationComple”处理程序,还添加了“init()”函数。

答案 3 :(得分:0)

不应将纯动作脚本项目重新创建为flex项目。除非出于某种原因需要灵活组件,否则应使用AS3项目选项。移植到flashbuilder背后的意图是什么?

答案 4 :(得分:0)

以下是我解决它的方法:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="1300" minHeight="700" applicationComplete="init()">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            private function init():void
            {   
                var show:TradeShowOrig = new TradeShowOrig();
                this.stage.addChild(show);
                show.init();
            }
        ]]>
    </fx:Script>

</s:Application>

请注意,Flex的“文档”类mxml名为TradeShow.mxml。我的主要课程是同样称为 TradeShow.as。这导致了无法解决的问题,因为事情变得非常混乱,没有明显的编译错误。我不得不将我的文档类重命名为TradeShowOrig.as,所有问题都突然消失了。