0

我正在构建一个 ActionScript 3 项目,并且发现在 MXML 中编写一些组件会简化一些事情。

看来我需要扩展 Flex Application 类才能做到这一点。如果这是正确的,我该怎么做?

目前我的主要对象扩展了 Sprite。然后使用 将其他 Sprite 添加到其中addChild(),我希望其中之一包含 Flex 组件。肯定有办法不用完全用 MXML 重写我的应用程序吗?

4

1 回答 1

2

编辑正如评论中发布的那样,我在这里的解释主要是关于过渡到 Spark 应用程序,同样的想法适用于 MX 应用程序,除了 MX 你可以坚持使用 addChild,一般来说,你需要实现 IUIComponent 才能使用容器见文档:

注意:虽然该方法的子参数指定为 DisplayObject 类型,但该参数必须实现 IUIComponent 接口才能添加为容器的子级。所有 Flex 组件都实现了这个接口。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/Container.html#addChild () 结束编辑

您可以将基类切换到 Application 而不是 Sprite,但是当向 Flex 4 应用程序添加元素时,它希望它们实现 IVisualElement。一般来说,您会将 addChild 调用切换到 addElement,并且您必须更改当前扩展 Sprite/MovieClip/DisplayObject 的其他类以扩展诸如 Group 之类的东西,以便它们实现 Flex 应用程序与它们一起工作的必要接口(通常是期望比较低级别的 Flash 对象提供更多的东西,因为它具有 LayoutManager、PopUpManager、组件生命周期等)。这里的问题是你会给你的组件增加一些重量,如果这是针对网络或桌面的,我不会太担心,但这会明显影响移动设备的性能。

不幸的是,它不是一个交钥匙类型的解决方案,它需要对代码进行一些手动修改,因为您必须根据其功能调用将每个对象更改为的内容,有时 Group 是其他时候您可能会得到的正确方法从其他容器或控件中获益更多。在某些情况下,您可能希望坚持使用当前较低级别的扩展(例如扩展 Sprite)并自己实现 IVisualElement。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/Container.html#addElement ()

如果您想为您的应用程序大规模切换到使用 MXML 文件,您还可以创建一个基本的 MXML 应用程序文件,并让它包含一个包含现有代码的脚本块(修改后构造函数代码移至创建完成)。或者,您可以拥有一个扩展应用程序的基本 .as 文件,然后将其用作 MXML 的基类,我将汇总一些示例。

示例 1一个非常基本的 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:Script>
        <![CDATA[

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

示例 2一个 AS3 类扩展应用程序和一个 MXML 类扩展该应用程序

[主.mxml]

<?xml version="1.0" encoding="utf-8"?>
<MyBaseApp
           xmlns="*"
           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">
    <s:Button id="btnControl"/>
</MyBaseApp>

[MyBaseApp.as]

package
{
    import mx.events.FlexEvent;

    import spark.components.Application;
    import spark.components.Button;

    public class MyBaseApp extends Application
    {
        public var btnControl:Button;
        public function MyBaseApp()
        {
            super();
            addEventListener(FlexEvent.CREATION_COMPLETE, creationCompleteHandler);
        }
        private function creationCompleteHandler(event:FlexEvent):void
        {
            btnControl.label = "something I set in AS3";
        }
    }
}
于 2012-07-28T20:05:52.170 回答