AS3 - 如何确定是否支持mx类/库?

时间:2011-02-25 20:31:30

标签: flex actionscript-3 events class actionscript

我正在编写一个帮助类,我希望它可以在 flex 和纯 actionscript 项目中使用。例如:

public static function listenToPositionAndSize(control:DisplayObject):void
{
      if (mxLibrariesSupported)
      {
            control.addEventListener(mx.events.ResizeEvent.RESIZE, onControlResize);
            control.addEventListener(mx.events.MoveEvent.MOVE, onControlMove);
      }
      else
      {
            control.addEventListener(flash.events.Event.RESIZE, onControlResize);
            control.addEventListener(flash.events.Event.ENTER_FRAME, onControlMove);
      }
}

如果上面的代码可行;此类可用于纯AS3和Flex项目。纯粹的AS3项目不会抱怨丢失的mx库...

我想,如果可以编译,下面的代码就可以了;

public static function mxLibrariesSupported():Boolean
{
      try
      {
            var e:mx.events.FlexEvent = 
                     new mx.events.FlexEvent(mx.events.FlexEvent.CHANGING);
            return true;
      }
      catch(error:Error){ }
      return false;
}

有更明确的方法吗?内置函数还是smth?

编辑:执行此操作的一个简单原因是:如果您查看上面的示例,我希望mx.events.MoveEvent.MOVE(如果可用)而不是flash.events.Event.ENTER_FRAME来解决性能问题。

感谢..

3 个答案:

答案 0 :(得分:2)

忽略这是否是一个好主意,解决方案很简单:

var isFlexFound:Boolean = true;

try{
    var myClass:Class = getDefinitionByName("mx.core.UIComponent") as Class;
}catch(err:*){
    isFlexFound = false;
}
trace("Flex Found: " + isFlexFound);

答案 1 :(得分:1)

您无法在纯AS3项目中导入mx.events,因此您可以使用某种映射函数,如:

public static MX_RESIZE_EVENT : String = "RESIZE";
public static FLASH_RESIZE_EVENT : String = "RESIZE";

public static function getResizeEventName() : String {
     return mxLibrariesSupported ? MX_RESIZE_EVENT : FLASH_RESIZE_EVENT;
}

public static function listenToPositionAndSize(control:DisplayObject):void
{
     control.addEventListener(getResizeEventName(), onControlResize);
}

无论如何都没有动态导入包,所以我认为你会被困在这样的事情上。这个解决方案很脆弱,因为它依赖于你从各自的类中手工复制事件类型字符串,这意味着如果它们在框架中发生变化,映射将会中断(与处理程序一样)。

答案 2 :(得分:1)

这个问题显示了对Flex编译器如何工作的明显误解,我相信你想要做的事情是徒劳的,毫无意义。

代码中使用的类被编译到SWC中。如果您引用/导入Flex特定类,那么这些类将被编译到SWC中,然后编译到最终的SWF中。因此,将此库与Flex依赖项一起使用,您将永远不会遇到mxLibrariesSupported()导致错误的情况;因为您引用FlexEvent这一事实意味着它将被编译到您的最终SWC中。

在您的评论中,您提到您无法在Flex项目中使用AS3类而无需复制它以添加Flex依赖项。我不知道为什么。 Flex Framework完全内置在AS3中,SWC中的任何AS3代码都可以在没有任何更改的Flex项目中使用。我做到了

如果要在非Flex项目中使用某些内容,请不要在库中放置AS3依赖项。