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'>&lt; </a><a href='event:next'> &gt;</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 とかするとうまくいかない??