Есть ли способ прослушивать события в классе всплывающих менеджеров? - PullRequest
2 голосов
/ 27 января 2012

Я пытаюсь определить, когда всплывающие окна видны (включая подсказки, если это возможно). Причина в том, что мне нужно скрыть или заморозить (сделать снимок) компоненты Stage * (StageWebView, StageVideo, StageText и т. Д.) При появлении всплывающих окон.

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Нет действительно простого способа достичь этого.Вы можете сделать следующее:

  • создать собственный менеджер всплывающих окон
  • заставить его отправлять события в Приложение, чтобы вы могли слушать где угодно
  • , скажите Flex использовать вашкласс вместо реализации по умолчанию

Создание пользовательского PopupManager

Мы создаем пользовательский класс PopupManager, к которому мы можем добавить некоторые пользовательские функции.В вашем случае, например, было бы интересно отправить событие в Application, чтобы мы могли прослушивать его из любого места в displayList.Мы будем расширять PopUpManagerImpl, который является реализацией по умолчанию, используемой Flex.

public class MyPopupManager extends PopUpManagerImpl {

    private static var instance:IPopUpManager;

    static public function getInstance():IPopUpManager 
    {
        if (!instance) instance = new MyPopupManager();
        return instance;
    }

    override public function addPopUp(
        window:IFlexDisplayObject, 
        parent:DisplayObject, 
        modal:Boolean=false, 
        childList:String=null, 
        moduleFactory:IFlexModuleFactory=null):void 
    {
        super.addPopUp(window, parent, modal, childList, moduleFactory);
        var app:IEventDispatcher = 
            IEventDispatcher(FlexGlobals.topLevelApplication);
        app.dispatchEvent(new Event("popupAdded", true));
    }

}

Мы переопределяем метод addPopup для отправки всплывающего события всякий раз, когда отображается всплывающее окно.Пока игнорируйте метод getInstance ().Я вернусь к этому позже.Что вам нужно знать, так это то, что FlashBuilder не будет автоматически управлять некоторыми вашими операциями импорта, поскольку эти классы были помечены как скрытые.Не о чем беспокоиться, но вам придется написать операторы импорта для:

import mx.managers.IPopUpManager;
import mx.managers.PopUpManagerImpl;

Скажите Flex использовать ваш класс вместо реализации по умолчанию

Thisбыло бы довольно просто:

import mx.core.Singleton;
Singleton.registerClass("mx.managers::IPopUpManager", MyPopupManager);

Единственная проблема заключается в том, что Flex уже зарегистрировал реализацию, и вы не можете переопределить ее, даже если вы выполняете это в preinitialize.Поэтому мы должны сделать это до того, как Flex начнет загрузку.Для этого мы будем использовать пользовательский предварительный загрузчик:

public class RegisteringPreloader extends DownloadProgressBar {

    override public function initialize():void {
        super.initialize();
        Singleton.registerClass("mx.managers::IPopUpManager", MyPopupManager);
    }

}

DownloadProgressBar является предварительным загрузчиком Flex по умолчанию.Мы просто добавляем дополнительный регистрационный код.Теперь не забудьте указать приложению использовать этот предварительный загрузчик:

<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"
               preloader="RegisteringPreloader" >

Теперь просто прослушайте событие

addEventListener("popupAdded", onPopupAdded);
PopUpManager.addPopUp(new Panel(), this);

Дополнительная информация

Теперь, почему MyPopupManager должен иметь статический метод getInstance ()?Это потому, что тот класс Singleton, который мы использовали для регистрации нашей реализации, ожидает, что каждый класс, который он регистрирует, будет одноэлементным и, следовательно, будет иметь метод с именем 'getInstance'.Он попытается вызвать этот метод и потерпит крах, если он не существует.Если вы не знаете, что такое синглтон, просто Google.Вы найдете тонны информации.

PS: Я действительно узнал что-то новое, пытаясь решить этот вопрос (спасибо за это).

0 голосов
/ 27 апреля 2017

Для моего Spark Application мне пришлось внести несколько других изменений в ответ RIAStar.Мой пользовательский класс еще не найден в preloader.initialize() (ApplicationDomain.currentDomain.getDefinition()), поэтому я добавил прослушиватель событий для события PRELOADER_DOC_FRAME_READY.

package com.mydomain.preloaders {

    import flash.display.Sprite;
    import flash.events.Event;
    import flash.system.ApplicationDomain;
    import flash.utils.getDefinitionByName;

    import mx.core.Singleton;
    import mx.events.FlexEvent;
    import mx.preloaders.SparkDownloadProgressBar;

    public class RegisteringPreloader extends SparkDownloadProgressBar {

        public function RegisteringPreloader() {

        }

        public var preloaderSprite:Sprite;

        override public function set preloader(value:Sprite):void {
            super.preloader = value;

            preloaderSprite = value;

            value.addEventListener(FlexEvent.PRELOADER_DOC_FRAME_READY, preloaderCompleteHandler);

        }

        protected function preloaderCompleteHandler(event:Event):void {
            var myCustomClass:Class;
            var classPath:String;
            var hasDefinition:Boolean;

            preloaderSprite.addEventListener(FlexEvent.PRELOADER_DOC_FRAME_READY, preloaderCompleteHandler);

            classPath = "com.domain.managers::MyClassImpl";
            hasDefinition = ApplicationDomain.currentDomain.hasDefinition(classPath);

            if (hasDefinition) {
                myCustomClass = Class(getDefinitionByName(classPath));

                Singleton.registerClass("mx.managers::ISingletonClass", myCustomClass);
            }
        }
    }
}

Остальные шаги такие же, как у RIAStar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...