2012-01-27 14 views
2

私は、ポップアップが表示されたとき(可能であればツールヒントを含む)を検出しようとしています。その理由は、ポップアップが表示されたときにStage *コンポーネント(StageWebView、StageVideo、StageTextなど)を非表示にする(スナップショットをキャプチャする)必要があるためです。ポップアップマネージャークラスのイベントをリッスンする方法はありますか?

答えて

2

これを達成する簡単な方法はありません。あなたは、クラスの代わりに、デフォルトの実装 を使用するには、Flexを伝えるどこでも

  • を聞くことができますので、アプリケーションのそれディスパッチイベントを作るカスタムPopUpManagerの
  • を作成

    • :何ができることはこれです

      我々は、我々はいくつかのカスタムを追加できるカスタムPopUpManagerのクラスを作成し、PopUpManagerの

      をカスタムを作成します。機能性。あなたのケースでは、アプリケーション上でイベントをディスパッチして、displayList上のどこからでもそのイベントを聴くことができます。 Flexで使用されるデフォルトの実装であるPopUpManagerImplを拡張します。

      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に知らせます

      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" > 
      

      今MyPopupManagerがしなければならないん理由だけ

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

      エクストライベント情報をリッスン静的なgetInstance()メソッドがありますか?これは、実装を登録するために使用したシングルトンクラスでは、登録するすべてのクラスがシングルトンであり、したがって 'getInstance'というメソッドを持つことを期待しているからです。このメソッドを呼び出そうとしますが、存在しなければクラッシュします。シングルトンが何であるかわからない場合は、ただグーグル。たくさんの情報が見つかります。

      PS:私は実際にこの問題を解決しようとしている何か新しいことを学んだ(それのおかげで)。

  • +0

    ありがとうございました。私は何か新しいことを学ぶのを助けることができてうれしいです。 ;) あなたが正しいです。この方法はこれを行う方法ですが、この機能の範囲外です。 systemManager addChildイベントまたはaddedToStageイベントのリスニングはどうですか? systemManager numOfElementsまたはnumOfChildrenはバインド可能ですか?私は可視性をsystemManager.numOfElements <1にバインドできますか? –

    +0

    あなたの学習で、Singleton.registerClassがどんなクラスでも動作するかどうか知っていますか?私自身の邪悪な目的のためにそれを使うことはできますか? –

    +0

    もう1つのコメントを追加してください。 PopUpManagerが実装を指し示しているので、オープン宣言は機能しません。 –

    0

    私のためSparkApplication私は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'sと同じです。

    関連する問題