我正在编写一个帮助类,我希望它可以在 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
来解决性能问题。
感谢..
答案 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依赖项。