Flash表示領域をリサイズする

HTML内でのswfの表示領域サイズをswfをリロードしないで変更(トリミング)する方法を模索していて、ようやく見つけて理解できたのでここにメモしておきます。

  • swfの表示コード(HTMLコード)を縦横共に100%にし、'scale'パラメータを'noscale'にします。
  • swfの表示サイズはそれを囲むdivのサイズで決めます。
  • javascriptで動かすサイズはdivのサイズ(CSSを使うと便利)。
  • swf内部からはExternalInterfaceでjavascriptを操作する。

以上の4点を理解できたら全く問題なく操作できます。
テスト実装してみたものを下記リンクにあげておきます。
http://octech.sakura.ne.jp/demo/resizeswf/

右側に表示されている男の子をクリックすると、サイズを変更します。

具体的なコード

swfの表示部分をくくるdivタグは以下のように定義しています。

<div id='main_swf' style='width:550;height:200;position:relative'>
<!-- ここにswfを表示するタグ -->
</div>

swfのサイズを変更しているjavascriptは以下のようになっています。

function changeMainSwfHeight( swfname, height )
{
  divSwf = document.getElementById( swfname );
  
  if( divSwf ){
    divSwf.style.height = height;
  }
  else{
    alert("There is no <div id='" + swfname + "' />.");
  }
}

これをActionScript側からは以下のように読んでいるわけです。

h = 300;
ExternalInterface.call( "changeMainSwfHeight" , "main_swf", h );

WebKitエンジンのブラウザで問題発生!

(2008年9月3日追記)Google Chromeが発表されていろいろ試していたら、どうやら、Chromeでは挙動がちょっと変わるようです。
上記サンプルの男の子をクリックしたとき、直後にはリサイズせず、カーソルがSWFのエリアから外れたときにリサイズされるようです。
FirefoxIE7Operaでは即座に動作しますが、ChromeSafariでおかしな挙動になるので、どうやら共通のブラウザエンジンであるWebKitの問題のようです。