我正在构建一个ActionScript 3项目,并且发现在MXML中编写一些组件可以简化操作。
似乎我需要扩展Flex Application类才能做到这一点。如果这是对的,我该怎么做?
目前我的Main对象扩展了Sprite。然后使用addChild()
将其他精灵添加到其中,我想在其中一个中使用Flex组件。当然有一种方法可以完全用MXML重写我的应用程序吗?
答案 0 :(得分:2)
编辑正如评论中所述,我的解释主要是关于过渡到Spark应用程序,相同类型的想法适用于MX应用程序,除了使用MX,你可以坚持使用addChild,一般来说您需要实现IUIComponent才能使用容器,请参阅docs:
注意:虽然方法的子参数指定为类型 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 Application与其一起使用的必要接口(通常它期望更多的东西比较低级别的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类[Main.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";
}
}
}