2


6

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

3 Answer


4


私はこの例を多くのFlex3プロジェクトで使ってきました。 それはまだFlex4 SDKで働いています:

どこから手に入れたのか覚えておくことができます。 そして、このスクリプトが何も参照していないことが重要であるとあなたが言うのは正しいです…


  • CustomPreloader *

package com.YYY.XXX.shell.view {import flash.display.Sprite; import flash.events.Event; import flash.events.ProgressEvent; import flash.events.TimerEvent; flash.utils.Timerをインポートします。

mx.events.FlexEventをインポートします。 import mx.preloaders.DownloadProgressBar;

public final class CustomPreloaderはDownloadProgressBarを拡張します。{public var loader:LoadScreen; private var _timer:タイマー。

パブリック関数CustomPreloader(){super(); }

パブリック関数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(); }

パブリック関数セットのプリローダーをオーバーライドします(プリローダー:スプライト)。 preloader.addEventListener(Event.COMPLETE、SWFDownloadComplete); preloader.addEventListener(FlexEvent.INIT_PROGRESS、FlexInitProgress); preloader.addEventListener(FlexEvent.INIT_COMPLETE、FlexInitComplete); }

プライベート関数SWFDownLoadScreen(event:ProgressEvent):無効{var prog:Number = event.bytesLoaded / event.bytesTotal * 100; if(this.loader){this.loader.progress = prog; }}

プライベート関数handleTimerTick(event:TimerEvent):void {th​​is.stage.addChild(this);} this.loader.x =(this.stageWidth  -  this.loader.width)/ 2; this.loader.y =(this.stageHeight  -  this.loader.height)/ 2; this.loader.refresh(); }

プライベート関数SWFDownloadComplete(event:Event):void {}

プライベート関数FlexInitProgress(event:Event):void {}

プライベート関数FlexInitComplete(event:Event):void {th​​is.loader.ready = true;} this._timer.stop(); this.dispatchEvent(new Event(Event.COMPLETE)); }

保護された関数をオーバーライドします。 }

保護された関数をオーバーライドします。showDisplayForDownloading(経過時間:int、イベント:ProgressEvent):Boolean {trueを返します。 }}}
  • LoadScreen *

パッケージcom.YYY.XXX.shell.view {

import flash.display.Bitmap; flash.display.BitmapDataをインポートします。 import flash.display.Graphics; import flash.display.Loader; import flash.display.Sprite; import flash.utils.ByteArray;

mx.graphics.codec.PNGEncoderをインポートします。

パブリッククラスLoadScreenはLoaderを拡張します{

//〜設定-------------------------------------------------- ------------ private static var _BarWidth:int = 153; //プログレスバーの幅プライベートstatic var _BarHeight:int = 12; //プログレスバーの高さprivate static var _LogoHeight:int = 153; //ロゴ画像の高さprivate static var _LogoWidth:int = 68; //ロゴ画像の幅プライベートstatic var _Padding:int = 5; //ロゴとプログレスバーの間隔private static var _LeftMargin:int = 0; //左余白プライベートstatic var _RightMargin:int = 0; //右マージンプライベートstatic var _TopMargin:int = 1; //上余白private static var _BottomMargin:int = 1; //下マージン

private static var _BarBackground:uint = 0xFFFFFF; //プログレスバーの背景private static var _BarOuterBorder:uint = 0x737373; //外枠の色プライベートstatic var _BarColor:uint = 0x6F9FD5; //プログラムバーの色private static var _BarInnerColor:uint = 0xFFFFFF; //プログラムバーの内側の色

//〜インスタンス属性--------------------------------------------- -  [Embed(source = "/ asset / embed / img / XXX.gif")]プライベート変数MyLogoClass:クラス。 private var _logo:ビットマップ。 private var _logoData:BitmapData;

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

//〜コンストラクタ---------------------------------------------- ---------パブリック関数LoadScreen(){super(); this.progress = 0; this._logo =ビットマップとしての新しいMyLogoClass。 }

//〜メソッド-------------------------------------------------- -------------パブリック関数refresh():void {th​​is._logoData = this.draw();} varエンコーダ:PNGEncoder = new PNGEncoder(); var bytes:ByteArray = encoder.encode(this._logoData); this.loadBytes(bytes); }

public function get width()をオーバーライドします。Number {return Math.max(_BarWidth、_LogoWidth)_LeftMargin _RightMargin;} }

public function get height()をオーバーライドします。Number {return _LogoHeight _BarHeight _Padding _TopMargin _BottomMargin;} }

プライベート関数draw():BitmapData {//データvar dataを作成するためのビットマップデータの作成:BitmapData = new BitmapData(this.width、this.height、true、0);

//プログレスバーを描くvar s:Sprite = new Sprite(); var g:グラフィック= s.graphics;

//バーの背景を描画します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 = _バー幅 -  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;

//ロゴdata.draw(this._logo.bitmapData、null、null、null、null、true)を描画します。データを返します。 }

public function set ready(値:ブール値):void {th​​is.isReady = value; this.visible =!this.isReady; }

パブリック関数get ready():Boolean {return this.isReady; }

}}


3


私は愚かだと思います…​私はプリローダー内からメインのアプリケーションクラスの1つを参照していたため、すべてのクラスがプリローダーにコンパイルされます。

今後の参考のために:プリローダー内のすべての参照を再確認し、絶対に必要なもの以外のものを使用しないようにしてください。


1


ここにFlex 4カスタムプリローダーのコードサンプルがあります。http://www.leavethatthingalone.com/blog/index.cfm/2009/11/11/Flex4CustomPreloader