frames.frame オプションでプリローディング
http://d.hatena.ne.jp/flashrod/20070317#1174093786 ここ見てわかった。getDefinitionByName() を使うのか。ただ [Frame(...)] 使うよりは、frames.frame オプション使った方がきめこまかくやれる気がする。以下サンプル。
http://park.geocities.jp/mxmlc/misc/FramesExample.html
メインクラス(プリローダ含む)
// FramesExample.as package { import flash.display.*; import flash.text.*; import flash.events.*; import flash.utils.*; import lw.*; public class FramesExample extends MovieClip { private var placeHold:Sprite = new Sprite(); private var progressBar:Sprite = new Sprite(); private var textField:TextField = new TextField(); public function FramesExample() { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; stop(); textField.autoSize = TextFieldAutoSize.LEFT; textField.defaultTextFormat = new TextFormat("_sans", 12); textField.background = true; progressBar.graphics.lineStyle(0, 0x000000); progressBar.graphics.beginFill(0xFFFFFF, 0.5); progressBar.graphics.drawRect(0, 0, 100, 4); progressBar.graphics.endFill(); addChild(placeHold); addChild(textField); addChild(progressBar); onEnterFrame(new Event(Event.ENTER_FRAME)); addEventListener(Event.ENTER_FRAME, onEnterFrame); onResize(new Event(Event.RESIZE)); stage.addEventListener(Event.RESIZE, onResize); } private var index:int = 0; private var images:Array = new Array(); private function onEnterFrame(ev:Event):void { textField.text = "bytes:" + root.loaderInfo.bytesLoaded + "/" + root.loaderInfo.bytesTotal + " - frames:" + framesLoaded + "/" + totalFrames; progressBar.width = stage.stageWidth * loaderInfo.bytesLoaded / loaderInfo.bytesTotal; if (index + 1 < framesLoaded) { index++; nextFrame(); var Image:Class = Class(getDefinitionByName("Image" + index)); if (Image) { var bm:Bitmap = new Image(); images.push(bm); removeChildAt(0); addChildAt(bm, 0); } onResize(new Event(Event.RESIZE)); } if (index == totalFrames - 1) { index--; removeEventListener(Event.ENTER_FRAME, onEnterFrame); onFullLoaded(); } } private function onResize(ev:Event):void { var bm:DisplayObject = getChildAt(0); bm.width = stage.stageWidth; bm.height = stage.stageHeight; } private function onFullLoaded():void { textField.htmlText = "<a href='event:prev'>< </a><a href='event:next'> ></a>" textField.addEventListener(TextEvent.LINK, function(ev:TextEvent):void { if (ev.text == "prev") { index = Math.max(0, index-1); } else { index = Math.min(totalFrames-2, index+1); } var bm:Bitmap = images[index]; removeChildAt(0); addChildAt(bm, 0); onResize(new Event(Event.RESIZE)); }); removeChild(progressBar); } } }
2、3、4フレームにそれぞれ画像を入れる。
FramesExample-config.xml
<flex-config> <default-size> <width>650</width> <height>400</height> </default-size> <default-frame-rate>30</default-frame-rate> <default-background-color>0xFFFFFF</default-background-color> <frames> <frame><label></label><classname>Image1</classname></frame> <frame><label></label><classname>Image2</classname></frame> <frame><label></label><classname>Image3</classname></frame> </frames> </flex-config>
画像用クラス Image2,Image3 も同様に。
// Image1.as package { import flash.display.*; [Embed(source="image1.jpg")] public class Image1 extends Bitmap { } }
- nextFrame() 重要。そのフレームに行かないとオブジェクト作られない。
- firefox で url#abc とかするとうまくいかない??