AS3 - Как определить, поддерживаются ли классы / библиотеки mx? - PullRequest
0 голосов
/ 25 февраля 2011

Я пишу вспомогательный класс и хочу, чтобы он использовался как в 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;
}

Есть либолее понятный способ?встроенная функция или что-то?

РЕДАКТИРОВАТЬ : Одна из простых причин сделать это: если вы проверите приведенный выше пример, я бы предпочел mx.events.MoveEvent.MOVE (если доступно) вместо flash.events.Event.ENTER_FRAME для проблем производительности.

спасибо ..

Ответы [ 3 ]

2 голосов
/ 26 февраля 2011

Пропустив, хорошая это идея или нет, решение простое:

var isFlexFound:Boolean = true;

try{
    var myClass:Class = getDefinitionByName("mx.core.UIComponent") as Class;
}catch(err:*){
    isFlexFound = false;
}
trace("Flex Found: " + isFlexFound);
1 голос
/ 26 февраля 2011

Этот вопрос показывает явное недопонимание того, как работает Flex Compiler, и я считаю, что то, что вы пытаетесь сделать, бесполезно и не имеет смысла.

Классы, используемые в коде, компилируются в SWC.Если вы ссылаетесь / импортируете специфические классы Flex, то эти классы будут скомпилированы в SWC, а затем в ваш последний SWF.Таким образом, используя эту библиотеку с зависимостями Flex, вы никогда не столкнетесь с ситуацией, когда mxLibrariesSupported () вызывает ошибку;потому что сам факт ссылки на FlexEvent означает, что он будет скомпилирован в ваш окончательный SWC.

В своем комментарии вы упомянули, что вы не можете использовать класс AS3 в проекте Flex без необходимости дублировать его для добавления зависимостей Flex.Понятия не имею почему.Flex Framework полностью построен в AS3, и любой код AS3 в SWC может использоваться в проекте Flex без каких-либо изменений.Я сделал это.

Если вы хотите использовать что-то в не-Flex проектах, не помещайте зависимости AS3 в библиотеку.

1 голос
/ 26 февраля 2011

Вы не можете импортировать mx.events в чистый проект AS3, поэтому у вас может быть какая-то функция отображения, например:

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);
}

В любом случае нет возможности динамически импортировать пакеты, поэтому я думаювы будете застревать, делая что-то подобное.Это решение хрупкое в том смысле, что оно полагается на то, что вы вручную копируете строки типов событий из их соответствующих классов, а это означает, что если они когда-либо изменятся в каркасе, отображение будет нарушено (как и ваши обработчики).

...