2009-07-18 18 views
2

Flex 4でカスタムプリローダーを正常に実装した人はいますか?私の経験では、アプリケーションタグでpreloader = "com.foo.MyPreloader"を使用してカスタムプリローダーを指定すると、プリローダーの目的を破ってSWFが完全にダウンロードされるまで、プリローダーは表示されません。おそらくこれは、まだベータ版のFlex 4フレームワークのバグですか?Flex 4のカスタムプリローダー?

+0

ウィッシュ...あなたはそれが、このスクリプトは何を参照されていないことが重要だと言う時に正しいですこれはコードsaを持っていた凄い! – Kieveli

+0

なぜコードサンプルが必要ですか?私はすでに問題を見つけました... – davr

答えて

3

私はプリローダ内のメインアプリケーションクラスの1つを参照していました。すべてのクラスがプリローダにコンパイルされ、すべてがロードされるまでプリローダが表示されません。今後の参考のために

:あなたは絶対に必要なもの以上のものを使用していないことを確認し、あなたのプリローダー内のすべての参照をダブルチェック

4

ですこの例を多くのFlex3プロジェクトで使用しています。それはまだFlex4 SDKで動作しています:

私はどこからそれを得ることができるか思い出すことができます。そして、あなたは

<s:Application tag ... preloader="com.YYY.XXX.shell.view.CustomPreloader" 

CustomPreloader

package com.YYY.XXX.shell.view 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.ProgressEvent; 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 

    import mx.events.FlexEvent; 
    import mx.preloaders.DownloadProgressBar; 

    public final class CustomPreloader 
     extends DownloadProgressBar 
    { 
     public var loader : LoadScreen; 
     private var _timer : Timer; 

     public function CustomPreloader() 
     { 
      super(); 
     } 

     override public function initialize() : void 
     { 
      super.initialize(); 

      this.loader = new LoadScreen(); 
      this.addChild(this.loader); 

      this._timer = new Timer(1); 
      this._timer.addEventListener(TimerEvent.TIMER, handleTimerTick); 
      this._timer.start(); 
     } 

     override public function set preloader(preloader : Sprite):void 
     {     
      preloader.addEventListener(ProgressEvent.PROGRESS, SWFDownLoadScreen); 
      preloader.addEventListener(Event.COMPLETE,   SWFDownloadComplete); 
      preloader.addEventListener(FlexEvent.INIT_PROGRESS, FlexInitProgress); 
      preloader.addEventListener(FlexEvent.INIT_COMPLETE, FlexInitComplete); 
     } 

     private function SWFDownLoadScreen(event : ProgressEvent) : void 
     { 
      var prog : Number = event.bytesLoaded/event.bytesTotal * 100; 
      if (this.loader) 
      { 
       this.loader.progress = prog; 
      } 
     } 

     private function handleTimerTick(event : TimerEvent) : void 
     { 
      this.stage.addChild(this); 
      this.loader.x = (this.stageWidth - this.loader.width)/2; 
      this.loader.y = (this.stageHeight - this.loader.height)/2; 
      this.loader.refresh(); 
     } 

     private function SWFDownloadComplete(event : Event) : void {} 

     private function FlexInitProgress(event : Event) : void {} 

     private function FlexInitComplete(event : Event) : void 
     {  
      this.loader.ready = true; 
      this._timer.stop(); 
      this.dispatchEvent(new Event(Event.COMPLETE)); 
     } 

     override protected function showDisplayForInit(elapsedTime:int, count:int):Boolean 
     { 
      return true; 
     } 

     override protected function showDisplayForDownloading(elapsedTime:int, 
                event:ProgressEvent):Boolean 
     { 
      return true; 
     } 
    } 
} 

にloadscreen

package com.YYY.XXX.shell.view 
{ 

    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.Graphics; 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.utils.ByteArray; 

    import mx.graphics.codec.PNGEncoder; 

    public class LoadScreen extends Loader { 

     //~ Settings ---------------------------------------------------------- 
     private static var _BarWidth  : int = 153; // Progress bar width 
     private static var _BarHeight : int = 12; // Progress bar height 
     private static var _LogoHeight : int = 153; // Logo picture height 
     private static var _LogoWidth : int = 68; // Logo picture width 
     private static var _Padding  : int = 5; // Spacing between logo and progress bar 
     private static var _LeftMargin : int = 0; // Left Margin 
     private static var _RightMargin : int = 0; // Right Margin 
     private static var _TopMargin : int = 1; // Top Margin 
     private static var _BottomMargin : int = 1; // Bottom Margin 

     private static var _BarBackground : uint = 0xFFFFFF; // background of progress bar 
     private static var _BarOuterBorder : uint = 0x737373; // color of outer border 
     private static var _BarColor  : uint = 0x6F9FD5; // color of prog bar 
     private static var _BarInnerColor : uint = 0xFFFFFF; // inner color of prog bar 

     //~ Instance Attributes ----------------------------------------------- 
     [Embed(source="/asset/embed/img/XXX.gif")] 
     private var MyLogoClass: Class; 
     private var _logo : Bitmap; 
     private var _logoData : BitmapData; 

     private var isReady : Boolean = false; 
     public var progress : Number; 

     //~ Constructor -------------------------------------------------------   
     public function LoadScreen() 
     { 
      super(); 
      this.progress = 0; 
      this._logo = new MyLogoClass as Bitmap; 
     } 

     //~ Methods ----------------------------------------------------------- 
     public function refresh() : void 
     { 
      this._logoData = this.draw(); 
      var encoder : PNGEncoder = new PNGEncoder(); 
      var bytes : ByteArray = encoder.encode(this._logoData); 
      this.loadBytes(bytes); 
     } 

     override public function get width() : Number 
     { 
      return Math.max(_BarWidth, _LogoWidth) + _LeftMargin + _RightMargin; 
     } 

     override public function get height() : Number 
     { 
      return _LogoHeight + _BarHeight + _Padding + _TopMargin + _BottomMargin; 
     } 

     private function draw() : BitmapData 
     { 
      // create bitmap data to create the data 
      var data : BitmapData = new BitmapData(this.width, this.height, true, 0); 

      // draw the progress bar 
      var s : Sprite = new Sprite(); 
      var g : Graphics = s.graphics; 

      // draw the bar background 
      g.beginFill(_BarBackground); 
      g.lineStyle(2, _BarOuterBorder, 1, true); 
      var px : int = (this.width - _BarWidth)/2; 
      var py : int = _TopMargin + _LogoHeight + _Padding; 
      g.drawRoundRect(px, py, _BarWidth, _BarHeight, 2); 
      var containerWidth : Number = _BarWidth - 4; 
      var progWidth : Number = containerWidth * this.progress/100; 
      g.beginFill(_BarColor); 
      g.lineStyle(1, _BarInnerColor, 1, true); 
      g.drawRect(px + 1, py + 1, progWidth, _BarHeight - 3); 
      data.draw(s); 

      // draw the logo 
      data.draw(this._logo.bitmapData, null, null, null, null, true); 
      return data; 
     } 

     public function set ready(value : Boolean) : void 
     { 
      this.isReady = value; 
      this.visible = !this.isReady; 
     } 

     public function get ready() : Boolean { return this.isReady; } 

    } 
}