<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>TONPOOBLOG &#187; actionscript3</title>
	<atom:link href="http://www.tonpoo.com/blog/category/flash/actionscript3/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tonpoo.com/blog</link>
	<description>神宮前にあるWEB制作事務所「株式会社ブリコルール（bricoleur inc.）」に所属しているFlash（ActionScript）開発＆WEB制作プロジェクト「Tonpoo.com」のブログです。</description>
	<lastBuildDate>Tue, 27 Jul 2010 12:20:08 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/category/flash/actionscript3/feed/" />
		<item>
		<title>AlivePDFを使ってSWFからPDF出力</title>
		<link>http://www.tonpoo.com/blog/2010/05/alivepdf/</link>
		<comments>http://www.tonpoo.com/blog/2010/05/alivepdf/#comments</comments>
		<pubDate>Mon, 10 May 2010 09:48:58 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[alivepdf]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1061</guid>
		<description><![CDATA[SWFから動的にPDFファイルを生成するためのライブラリであるAlivePDFをちょっと使ってみました。 alivepdf &#8211; Project Hosting on Google Code AIRなら単体でのPDF出力も可能なようですが、SWFファイルからだと単体では無理で、サーバー側にファイル出力用（？）のphpプログラムを設置する必要があるようです。ただ、そのphpプログラムも提供されていたので、とりあえず単純なプログラムを組んで試してみました。 試しに組んでみたファイルのドキュメントクラスは以下の通り。 package { import flash.display.MovieClip; import flash.events.MouseEvent; import org.alivepdf.colors.RGBColor; import org.alivepdf.display.Display; import org.alivepdf.fonts.CoreFont; import org.alivepdf.fonts.FontFamily; import org.alivepdf.fonts.Style; import org.alivepdf.images.ImageFormat; import org.alivepdf.layout.Layout; import org.alivepdf.layout.Orientation; import org.alivepdf.layout.Size; import org.alivepdf.layout.Unit; import org.alivepdf.pdf.PDF; import org.alivepdf.saving.Download; import org.alivepdf.saving.Method; import utils.Utils; /** * ... * @author bricoleur.inc / Tonpoo.com */ public final [...]]]></description>
			<content:encoded><![CDATA[<p>SWFから動的にPDFファイルを生成するためのライブラリであるAlivePDFをちょっと使ってみました。</p>
<p><strong><a href="http://code.google.com/p/alivepdf/" target="_blank">alivepdf &#8211; Project Hosting on Google Code</a></strong></p>
<p>AIRなら単体でのPDF出力も可能なようですが、SWFファイルからだと単体では無理で、サーバー側にファイル出力用（？）のphpプログラムを設置する必要があるようです。ただ、そのphpプログラムも提供されていたので、とりあえず単純なプログラムを組んで試してみました。<br />
<span id="more-1061"></span></p>
<p>試しに組んでみたファイルのドキュメントクラスは以下の通り。</p>
<pre class="brush: as3;">package  {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import org.alivepdf.colors.RGBColor;
	import org.alivepdf.display.Display;
	import org.alivepdf.fonts.CoreFont;
	import org.alivepdf.fonts.FontFamily;
	import org.alivepdf.fonts.Style;
	import org.alivepdf.images.ImageFormat;
	import org.alivepdf.layout.Layout;
	import org.alivepdf.layout.Orientation;
	import org.alivepdf.layout.Size;
	import org.alivepdf.layout.Unit;
	import org.alivepdf.pdf.PDF;
	import org.alivepdf.saving.Download;
	import org.alivepdf.saving.Method;
	import utils.Utils;

	/**
	 * ...
	 * @author bricoleur.inc / Tonpoo.com
	 */
	public final class AlivePDFSample extends MovieClip{

		public function AlivePDFSample() {
			this.stage.addEventListener(MouseEvent.MOUSE_DOWN, onClick, false, 0, true);
		}
		private function onClick(e:MouseEvent):void {
			//PDFインスタンスを生成
			var myPDF:PDF = new PDF(Orientation.PORTRAIT, Unit.MM, Size.A4);
			//PDFの表示モードを指定
			myPDF.setDisplayMode(Display.FULL_PAGE, Layout.SINGLE_PAGE);
			//PDFのページを追加
			myPDF.addPage();

			//文字色を設定
			myPDF.textStyle ( new RGBColor ( 0xFF0000 ) );
			//フォントサイズを指定
			myPDF.setFontSize ( 18 );
			//ページの位置（？）を指定
			myPDF.setXY( 10, 40 );
			//マルチセルの追加
			myPDF.addMultiCell ( 300, 1, &quot;This is my PDF Headline&quot; );

			//PDFの出力
			myPDF.save(Method.REMOTE, &quot;http://www.tonpoo.com/_test/create.php&quot;, Download.ATTACHMENT, &quot;sample.pdf&quot;);
		}
	}
}</pre>
<h3>PDFインスタンスを生成</h3>
<pre class="brush: as3;">//PDFインスタンスを生成
var myPDF:PDF = new PDF(Orientation.PORTRAIT, Unit.MM, Size.A4);</pre>
<p>まずはnew演算子でPDFインスタンスを生成。引数には「印刷方向」「単位」「印刷サイズ」「印刷角度」を指定できます。何も指定しなくてもいいようですが、サンプルでは「印刷角度」以外を指定してます。</p>
<dl>
<dt>印刷方向</dt>
<dd>
<ul>
<li><strong>Orientation.LANDSCAPE</strong>：横向き</li>
<li><strong>Orientation.PORTRAIT</strong>：縦向き</li>
</ul>
</dd>
<dt>単位</dt>
<dd>
<ul>
<li><strong>Unit.CM</strong>：センチメートル</li>
<li><strong>Unit.INCHES</strong>：インチ</li>
<li><strong>Unit.MM</strong>：ミリメートル</li>
<li><strong>Unit.POINT</strong>：ポイント</li>
</ul>
</dd>
<dt>印刷サイズ</dt>
<dd>
<ul>
<li><strong>Size.A3</strong>：A3</li>
<li><strong>Size.A4</strong>：A4</li>
<li><strong>Size.A5</strong>：A5</li>
<li><strong>Size.LEGAL</strong>：リーガル</li>
<li><strong>Size.LETTER</strong>：レター</li>
<li><strong>Size.TABLOID</strong>：タブロイド</li>
</ul>
</dd>
</dl>
<p>「印刷サイズ」でA4やA5の他にレターやリーガルがあるあたりは欧米の紙サイズが基準になってるためですね。B4やB5など上記に無いサイズを指定する場合は・・・どうしたらいいんでしょ。</p>
<h3>PDFの表示モードを指定</h3>
<pre class="brush: as3;">//PDFの表示モードを指定
myPDF.setDisplayMode(Display.FULL_PAGE, Layout.SINGLE_PAGE);</pre>
<p>次に出力したPDFファイルを開いたときの表示モードを<strong>PDF.setDisplayMode</strong>で指定。引数には「ズーム」「レイアウト」「モード」「拡大率」を指定できます（サンプルでは「ズーム」と「レイアウト」のみ指定）。</p>
<dl>
<dt>ズーム</dt>
<dd>
<ul>
<li><strong>Display.DEFAULT</strong>：デフォルト</li>
<li><strong>Display.FULL_PAGE</strong>：ページ全体を表示</li>
<li><strong>Display.FULL_WIDTH</strong>：ページ幅を基準に表示</li>
<li><strong>Display.REAL</strong>：よくわからない。100%表示ってこと？</li>
</ul>
</dd>
<dt>レイアウト</dt>
<dd><strong>Layout.SINGLE_PAGE</strong>が「単一ページ」のことだろうと思うんですが、他の値（<strong>Layout.ONE_COLUMN / Layout.TWO_COLUMN_LEFT / Layout.TWO_COLUMN_RIGHT / Layout.TWO_COLUMN_RIGHT / Layout.TWO_PAGE_LEFT</strong>）については試してないのでよく分かりません。おそらく複数ページ同時表示とかだと思うんですが・・・。</dd>
<dt>拡大率</dt>
<dd>数値で拡大率を指定できるようです。</dd>
</dl>
<h3>PDFのページを追加</h3>
<pre class="brush: as3;">//PDFのページを追加
myPDF.addPage();</pre>
<p>次に、<strong>PDF.addPage()</strong>メソッドを使ってページを追加します。単純にこのaddPageメソッドを例えば10回繰り返すと、空のページ10ページで構成されるPDFファイルができます。</p>
<h3>テキストの追加</h3>
<pre class="brush: as3;">//文字色を設定
myPDF.textStyle ( new RGBColor ( 0xFF0000 ) );
//フォントサイズを指定
myPDF.setFontSize ( 18 );
//ページの位置（？）を指定
myPDF.setXY( 10, 40 );
//マルチセルの追加
myPDF.addMultiCell ( 300, 1, &quot;This is my PDF Headline&quot; );</pre>
<p>まずは<strong>PDF.textStyle</strong>メソッドで文字色を指定。引数には色指定の他にも下記のオプションが指定できますが、今回は割愛。</p>
<dl>
<dt>文字色</dt>
<dd><strong>colors.IColor</strong>クラスというのがあって、そのクラスオブジェクトを指定するようです。とりあえずサンプルに従って<strong>colors.RGBColor</strong>インスタンスを指定してみました。</dd>
<dt>透過率</dt>
<dd>0～1の数値（Number）で文字の透過率を指定できます。</dd>
<dt>レンダリングモード</dt>
<dd>整数値（int）を指定する事でテキストレンダリングモードを指定できるそうですが、なんのことやら・・・。</dd>
<dt>単語間スペース</dt>
<dd>数値（Number）で単語間のスペースの値を指定できます。</dd>
<dt>文字間スペース</dt>
<dd>数値（Number）で文字間のスペースの値を指定できます。</dd>
<dt>スケール</dt>
<dd>数値（Number）で、Text scalingが指定できます。Text scalingって何でしょう・・・</dd>
<dt>行間</dt>
<dd>数値（Number）で行間を指定できます。</dd>
</dl>
<p>次に<strong>PDF.setFontSize</strong>メソッドでフォントサイズを設定します。引数には整数値（int）が入ります。</p>
<p>次に<strong>PDF.setXY</strong>メソッドでページ内のX,Y位置を指定します。これって、要はこの後に配置するマルチセルの配置位置、って認識でいいんですかね・・・。</p>
<p>でもってその後に<strong>PDF.addMultiCell</strong>メソッドでテキストを含むセルを配置します。まだよくわかってないんですが、どうやらこの「<strong>セル</strong>」というのがPDFのページ内にいろいろ配置する単位のような感じなんですかね。引数には「幅」「高さ」「テキスト」「ボーダー」「横揃え」「塗り（？）」を指定できるようです。</p>
<h3>PDFの出力</h3>
<pre class="brush: as3;">//PDFの出力
myPDF.save(Method.REMOTE, &quot;http://www.tonpoo.com/xxxxxxxxx/create.php&quot;, Download.ATTACHMENT, &quot;sample.pdf&quot;);</pre>
<p>最後に、<strong>PDF.save</strong>メソッドを使って内容を出力します。引数に指定できるのは「データ送信形式」「送信先URL」「ダウンロード形式」「ファイル名」「表示フレーム名」です。</p>
<dl>
<dt>データ送信形式</dt>
<dd>サーバー側にデータを送信してPDFを生成する場合は<strong>Method.REMOTE</strong>、AIRを使った場合などでローカル側のみでPDFを生成する場合は<strong>Method.LOCAL</strong>を指定するようです。</dd>
<dt>送信先URL</dt>
<dd>Method.REMOTEの場合に、送信先のphpファイルのURLをここで指定します。</dd>
<dt>ダウンロード形式</dt>
<dd>PDFをブラウザ内で表示する場合は<strong>Download.INLINE</strong>、保存ダイアログを出して保存させる場合は<strong>Download.ATTACHMENT</strong>を指定します。</dd>
<dt>ファイル名</dt>
<dd>pdfファイルのファイル名を指定します。</dd>
<dt>表示フレーム名</dt>
<dd>フレーム内で展開されているコンテンツの場合に、PDFを開く先のフレーム名を指定する、ようです。</dd>
</dl>
<p>ちなみにサーバー側に設置するphp（create.php）のサンプルファイルは、前バージョンのAlivePDFのソースコード一式の中に入っていたものを流用しました。</p>
<pre class="brush: php;">&lt;?php

$method = $_GET['method'];
$name = $_GET['name'];

if ( isset ( $GLOBALS[&quot;HTTP_RAW_POST_DATA&quot;] )) {

	// get bytearray
	$pdf = $GLOBALS[&quot;HTTP_RAW_POST_DATA&quot;];

	// add headers for download dialog-box
	header('Content-Type: application/pdf');
	header('Content-Length: '.strlen($pdf));
	header('Content-disposition:'.$method.'; filename=&quot;'.$name.'&quot;');
	echo $pdf;

}  else echo 'An error occured.';

?&gt;</pre>
<p>とりあえず実際にアップして確認した所、PDFファイルが生成されてダウンロードできることを確認できました。次は任意のMovieClipの内容などをそのまま出力する方法とかですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/05/alivepdf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/05/alivepdf/" />
	</item>
		<item>
		<title>SWFWheelを使ってみる</title>
		<link>http://www.tonpoo.com/blog/2010/04/swfwheel/</link>
		<comments>http://www.tonpoo.com/blog/2010/04/swfwheel/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 15:10:16 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[swfwheel]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=1014</guid>
		<description><![CDATA[AS3から実装された、マウスホイールを検知するMouseEvent.MOUSE_WHEELイベントはMacでは動作しない、というのは知っていて、その問題を解消するためのライブラリがあるという話も聞いていたのですが、実際に使ってみる機会に遭遇したので、備忘録もかねて導入までのフローをメモしてみました。ちなみに参考にしたのはfeb19さんの以下の記事： feb19.jp blog &#8211; SWFWheelを使う 導入したライブラリはSWFWheelです。実際の導入フローは以下の通り： SWFWheel.asのダウンロード まずはasファイルのダウンロード。Spark projectのSWFWheelのページの「ソースコードはこちら」または「リポジトリブラウザで閲覧」からディレクトリを掘っていってSWFWheel.asを見つけてダウンロード。めんどくさい人は以下のリンクを右クリック→「名前を付けて保存」で。 http://www.libspark.org/svn/as3/SWFWheel/trunk/src/org/libspark/ui/SWFWheel.as SWFWheel.asの配置 ダウンロードしてきたSWFWheel.asはそのまま配置するのではなく、適切なフォルダを作ってその中に配置する。例えば以下のようなフォルダ構成になっていた場合： /project/fla/ flaファイルの格納フォルダ /project/as/ クラスファイル（asファイル）の格納フォルダ /project/deploy/ swfファイルやhtmlファイルの格納フォルダ /project/as/フォルダの中に「org」フォルダを作成。その中に「libspark 」フォルダを作成。その中にさらに「ui」フォルダを作成し、その中に配置する。実際に作業するflaファイルやそのドキュメントクラス、公開用のhtmlファイルやjsファイルも含めると、全体の構成は以下のようになる。 /project/fla/ flaファイルの格納フォルダ /project/fla/main.fla メインのflaファイル /project/as/ クラスファイル（asファイル）の格納フォルダ /project/as/Main.as main.flaのドキュメントクラス /project/as/org/libspark/ui/SWFWheel.as SWFWheel.asの配置場所 /project/deploy/ swfファイルやhtmlファイルの格納フォルダ /project/deploy/main.swf main.flaの出力ファイル /project/deploy/main.html main.swfを表示するhtmlファイル /project/deploy/js/swfobject.js swfファイルをhtmlファイルに埋め込むためのJavaScriptライブラリ HTML側の調整 今回はSWFObject2を使った想定なので、SWFObject 2 HTML and JavaScript ジェネレーター v1.2を使って埋め込みコードを生成。その際、以下の点をチェックする。 「Flashコンテンツのid」と「属性：name」を設定する。 「Flashコンテンツのid」と「属性：name」の値は同一のものにする。 allowscriptaccessの値をalwaysにする。 できたサンプルソースは以下の通り。 &#60;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML [...]]]></description>
			<content:encoded><![CDATA[<p>AS3から実装された、マウスホイールを検知する<strong>MouseEvent.MOUSE_WHEEL</strong>イベントはMacでは動作しない、というのは知っていて、その問題を解消するためのライブラリがあるという話も聞いていたのですが、実際に使ってみる機会に遭遇したので、備忘録もかねて導入までのフローをメモしてみました。ちなみに参考にしたのはfeb19さんの以下の記事：</p>
<p><strong><a href="http://feb19.jp/blog/archives/000167.php" target="_blank">feb19.jp blog &#8211; SWFWheelを使う</a></strong></p>
<p>導入したライブラリは<strong>SWFWheel</strong>です。実際の導入フローは以下の通り：<br />
<span id="more-1014"></span></p>
<h2>SWFWheel.asのダウンロード</h2>
<p>まずはasファイルのダウンロード。<strong><a href="http://www.libspark.org/wiki/SWFWheel" target="_blank">Spark projectのSWFWheelのページ</a></strong>の「ソースコードはこちら」または「リポジトリブラウザで閲覧」からディレクトリを掘っていってSWFWheel.asを見つけてダウンロード。めんどくさい人は以下のリンクを右クリック→「名前を付けて保存」で。</p>
<p><a href="http://www.libspark.org/svn/as3/SWFWheel/trunk/src/org/libspark/ui/SWFWheel.as" target="_blank">http://www.libspark.org/svn/as3/SWFWheel/trunk/src/org/libspark/ui/SWFWheel.as</a></p>
<h2>SWFWheel.asの配置</h2>
<p>ダウンロードしてきたSWFWheel.asはそのまま配置するのではなく、適切なフォルダを作ってその中に配置する。例えば以下のようなフォルダ構成になっていた場合：</p>
<dl>
<dt>/project/fla/</dt>
<dd>flaファイルの格納フォルダ</dd>
<dt>/project/as/</dt>
<dd>クラスファイル（asファイル）の格納フォルダ</dd>
<dt>/project/deploy/</dt>
<dd>swfファイルやhtmlファイルの格納フォルダ</dd>
</dl>
<p>/project/as/フォルダの中に「org」フォルダを作成。その中に「libspark<br />
」フォルダを作成。その中にさらに「ui」フォルダを作成し、その中に配置する。実際に作業するflaファイルやそのドキュメントクラス、公開用のhtmlファイルやjsファイルも含めると、全体の構成は以下のようになる。</p>
<dl>
<dt>/project/fla/</dt>
<dd>flaファイルの格納フォルダ</dd>
<dt>/project/fla/main.fla</dt>
<dd>メインのflaファイル</dd>
<dt>/project/as/</dt>
<dd>クラスファイル（asファイル）の格納フォルダ</dd>
<dt>/project/as/Main.as</dt>
<dd>main.flaのドキュメントクラス</dd>
<dt style="color:#ff0000;">/project/as/org/libspark/ui/SWFWheel.as</dt>
<dd style="color:#ff0000;">SWFWheel.asの配置場所</dd>
<dt>/project/deploy/</dt>
<dd>swfファイルやhtmlファイルの格納フォルダ</dd>
<dt>/project/deploy/main.swf</dt>
<dd>main.flaの出力ファイル</dd>
<dt>/project/deploy/main.html</dt>
<dd>main.swfを表示するhtmlファイル</dd>
<dt>/project/deploy/js/swfobject.js</dt>
<dd>swfファイルをhtmlファイルに埋め込むためのJavaScriptライブラリ</dd>
</dl>
<h2>HTML側の調整</h2>
<p>今回はSWFObject2を使った想定なので、<a href="http://www.tonpoo.com/docs/swfobject_generator/" target="_blank">SWFObject 2 HTML and JavaScript ジェネレーター v1.2</a>を使って埋め込みコードを生成。その際、以下の点をチェックする。</p>
<ul>
<li>「<strong>Flashコンテンツのid</strong>」と「<strong>属性：name</strong>」を設定する。</li>
<li>「Flashコンテンツのid」と「属性：name」の<strong>値は同一のものにする。</strong></li>
<li><strong>allowscriptaccess</strong>の値を<strong>always</strong>にする。</li>
</ul>
<p><img src="http://www.tonpoo.com/blog/wp-content/uploads/2010/04/ss_swfobject.png" alt="ss_swfobject" title="ss_swfobject" width="412" height="616" class="alignnone size-full wp-image-1028" /><br />
できたサンプルソースは以下の通り。</p>
<pre class="brush: xml;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;ja&quot; xml:lang=&quot;ja&quot;&gt;
	&lt;head&gt;
		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
		&lt;title&gt;&lt;/title&gt;
		&lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;text/javascript;&quot; /&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;js/swfobject.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			var flashvars = {};
			var params = {};
			params.allowscriptaccess = &quot;always&quot;;
			var attributes = {};
			attributes.id = &quot;flashAreaContent&quot;;
			attributes.name = &quot;flashAreaContent&quot;;
			swfobject.embedSWF(&quot;main.swf&quot;, &quot;myAlternativeContent&quot;, &quot;800&quot;, &quot;600&quot;, &quot;9.0.0&quot;, false, flashvars, params, attributes);
		&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div id=&quot;myAlternativeContent&quot;&gt;
			&lt;a href=&quot;http://www.adobe.com/go/getflashplayer_jp&quot;&gt;
				&lt;img src=&quot;http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif&quot; alt=&quot;Get Adobe Flash player&quot; /&gt;
			&lt;/a&gt;
		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>SWFWheelクラスのインポートと初期化</h2>
<p>ではドキュメントクラスMain.asの記述開始。まずはSWFWheelのインポートと初期化。初期化に使うのは<strong>SWFWheel.initialize</strong>メソッドで、<strong>引数としてステージへの参照を渡す</strong>。</p>
<pre class="brush: as3;">package  {
	import flash.display.MovieClip;
	import org.libspark.ui.SWFWheel;

	public class Main extends MovieClip{
		public function Main() {
			SWFWheel.initialize(this.stage);	//SWFWheelの初期化。引数としてステージへの参照を渡す。
		}
	}

}</pre>
<h2>マウスホイールイベントの検出</h2>
<p>次に実際にマウスホイールイベントを検出してみる。マウスホイールイベントのハンドラメソッドで受け取るMouseEventの<strong>delta</strong>プロパティというのが<strong>マウスホイールを 1 目盛り回すごとにスクロールする行数を示す</strong>そうなので、試しにtraceさせてみる。</p>
<pre class="brush: as3;">package  {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import org.libspark.ui.SWFWheel;

	public class Main extends MovieClip{
		public function Main() {
			SWFWheel.initialize(this.stage);
			this.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel, false, 0, true);
		}
		private function onMouseWheel(e:MouseEvent):void {
			trace(&quot;onMouseWheel:&quot;, e.delta);
		}
	}
}</pre>
<p>出た出た。あとはこの値を使って具体的な処理を追加するだけですね。Macで動くかどうかは一通りのファイルをサーバーにアップして確認。で、きちんと動きました。これで問題ありません！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/04/swfwheel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/04/swfwheel/" />
	</item>
		<item>
		<title>BitmapDataの「2880ピクセルの罠」もとい、「幅or高さ8,192ピクセル＆ピクセル総数16,777,216の罠」</title>
		<link>http://www.tonpoo.com/blog/2010/03/bitmapdata-2880/</link>
		<comments>http://www.tonpoo.com/blog/2010/03/bitmapdata-2880/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 03:37:11 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[actionscript2]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[troubles]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=887</guid>
		<description><![CDATA[またまた今更ながらの備忘録メモ。FlashPlayer8から使えるようになったBitmapDataクラスによって、動的にフィルターをかけたり、グラデーションのついたマスク表現などを使えるようになりました。 が、フィルターやグラデーションマスクといった機能、サイズ（ファイルサイズではなく、width x heightのサイズ）の大きな画像やオブジェクトに対しては効きません。具体的には、対象となるオブジェクトのwidthまたはheightが2880ピクセルを超過すると、こうした機能が無効になります。 で、その詳しい理由については下記のURLが詳しい： Flash 8 のイメージ API の概要 &#124; デベロッパーセンター 該当する部分の引用： メモ : Flash Player では、ビットマップの最大サイズは幅、高さいずれも 2880 ピクセルに制限されています。この制約よりも大きい BitmapData インスタンスを作成しようとすると、ビットマップは作成されません。これは、クライアントの RAM を使い切るような Flash ムービーを作成できないようにするために設定されています。2880 × 2880 ピクセルのビットマップには、約 32 MB 程度の RAM が必要です。 残念ながらFlashPlayer10でもまだこの点についての変更は無い模様。なぜこの記事を書いてるかというと、今現在この問題で引っかかってるため。さて、どうして回避したものか・・・。 ＜追記＞ kaedeさんからコメントで情報いただきましたが、FlashPlayer10からはBitmapDataサイズの制限が拡大されていますね。 BitmapData &#8211; ActionScript 3.0 言語およびコンポーネントリファレンス 当該部分を引用： AIR 1.5 および Flash Player 10 では、BitmapData オブジェクトの最大サイズは幅または高さが 8,192 ピクセルで、ピクセルの総数は 16,777,216 を超えないようにする必要があります（したがって、BitmapData [...]]]></description>
			<content:encoded><![CDATA[<p>またまた今更ながらの備忘録メモ。FlashPlayer8から使えるようになった<strong>BitmapDataクラス</strong>によって、動的にフィルターをかけたり、グラデーションのついたマスク表現などを使えるようになりました。</p>
<p>が、フィルターやグラデーションマスクといった機能、サイズ（ファイルサイズではなく、width x heightのサイズ）の大きな画像やオブジェクトに対しては効きません。具体的には、対象となるオブジェクトのwidthまたはheightが<strong style="color:#FF0000;font-size:20px;">2880ピクセル</strong>を超過すると、こうした機能が無効になります。</p>
<p>で、その詳しい理由については下記のURLが詳しい：</p>
<p><strong><a href="http://www.adobe.com/jp/devnet/flash/articles/image_api_02.html" target="_blank">Flash 8 のイメージ API の概要 | デベロッパーセンター</a></strong></p>
<p>該当する部分の引用：</p>
<blockquote><p>メモ : Flash Player では、<strong>ビットマップの最大サイズは幅、高さいずれも 2880 ピクセルに制限されています。この制約よりも大きい BitmapData インスタンスを作成しようとすると、ビットマップは作成されません。</strong>これは、クライアントの RAM を使い切るような Flash ムービーを作成できないようにするために設定されています。2880 × 2880 ピクセルのビットマップには、約 32 MB 程度の RAM が必要です。</p></blockquote>
<p><del datetime="2010-03-03T04:22:29+00:00">残念ながらFlashPlayer10でもまだこの点についての変更は無い模様。</del>なぜこの記事を書いてるかというと、今現在この問題で引っかかってるため。さて、どうして回避したものか・・・。</p>
<h3>＜追記＞</h3>
<p>kaedeさんからコメントで情報いただきましたが、FlashPlayer10からはBitmapDataサイズの制限が拡大されていますね。</p>
<p><strong><a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/display/BitmapData.html#BitmapData%28%29" target="_blank">BitmapData &#8211; ActionScript 3.0 言語およびコンポーネントリファレンス</a></strong></p>
<p>当該部分を引用：</p>
<blockquote><p>AIR 1.5 および Flash Player 10 では、BitmapData オブジェクトの最大サイズは<strong style="color:#FF0000;font-size:16px;">幅または高さが 8,192 ピクセル</strong>で、<strong style="color:#FF0000;font-size:16px;">ピクセルの総数は 16,777,216</strong> を超えないようにする必要があります（したがって、<strong>BitmapData オブジェクトの幅が 8,192 ピクセルの場合、高さは 2,048 ピクセル以下にする必要があります</strong>）。Flash Player 9 以前および AIR 1.1 以前では、高さの制限は 2,880 ピクセル、幅の制限は 2,880 ピクセルです。幅または高さに 2880 より大きい値を指定すると、新しいインスタンスは作成されません。</p></blockquote>
<p>なるほど、8192 x 8192ピクセル、ってのはダメなんですね。で、改めて今回作業してるファイルを見ると、cacheAsBitmapかけようと思ったインスタンスの横幅が<strong>9600ピクセル</strong>・・・。そ、そりゃあダメですよね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/03/bitmapdata-2880/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/03/bitmapdata-2880/" />
	</item>
		<item>
		<title>navigateToURL+IE+wmode:&#8221;transparent&#8221;の憂鬱</title>
		<link>http://www.tonpoo.com/blog/2010/01/navigatetourl-ie-wmode-transparent/</link>
		<comments>http://www.tonpoo.com/blog/2010/01/navigatetourl-ie-wmode-transparent/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 12:36:36 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[troubles]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=690</guid>
		<description><![CDATA[「addEventListenerの書き方の定番」や「ステージのインスタンスを自動宣言」と同じような、備忘録を兼ねたas3メモ。 as3で他ページへのリンクを実装する場合、通常はnavigateToURLメソッドが使われます。 package { import flash.display.MovieClip; import flash.events.MouseEvent; import flash.net.navigateToURL; import flash.net.URLRequest; public class Main extends MovieClip { btn.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true); } public var btn:MovieClip; public function onBtnClick(e:MouseEvent):void { var url:String = &#34;http://www.tonpoo.com/&#34;; var req:URLRequest = new URLRequest(url); navigateToURL(req, &#34;_self&#34;); } } 上記はリンク先を同じウィンドウで表示する場合の例。別ウィンドウで表示させる場合は、navigateToURLの行が以下のようになります。 navigateToURL(req, &#34;_blank&#34;); さて、通常であればこれで問題ないのですが、swfファイルをhtml上に埋め込むための設定で、wmodeの値を&#8220;transparent&#8221;や&#8220;opaque&#8221;にしていた場合、この方法でリンクボタンの設定をすると、IEで実行した時にポップアップブロックの警告が出てしまい、すんなりリンク先を開く事ができなくなります。 ※wmode=&#8221;window&#8221;の場合は問題ないようです。 さてどうするかということで参考になるのが下記の記事。 IEのポップアップブロックのブロック &#124; エントリー &#124; _level0.KAYAC [...]]]></description>
			<content:encoded><![CDATA[<p>「<a href="http://www.tonpoo.com/blog/2009/12/addeventlistener/">addEventListenerの書き方の定番</a>」や「<a href="http://www.tonpoo.com/blog/2009/12/as3_stage_instance/">ステージのインスタンスを自動宣言</a>」と同じような、備忘録を兼ねたas3メモ。</p>
<p>as3で他ページへのリンクを実装する場合、通常は<strong>navigateToURL</strong>メソッドが使われます。</p>
<pre class="brush: as3;">package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.net.navigateToURL;
	import flash.net.URLRequest;

	public class Main extends MovieClip {
		btn.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true);
	}

	public var btn:MovieClip;

	public function onBtnClick(e:MouseEvent):void {
		var url:String = &quot;http://www.tonpoo.com/&quot;;
		var req:URLRequest = new URLRequest(url);
		navigateToURL(req, &quot;_self&quot;);
	}
}</pre>
<p><span id="more-690"></span><br />
上記はリンク先を同じウィンドウで表示する場合の例。別ウィンドウで表示させる場合は、navigateToURLの行が以下のようになります。</p>
<pre class="brush: as3;">navigateToURL(req, &quot;_blank&quot;);</pre>
<p>さて、通常であればこれで問題ないのですが、swfファイルをhtml上に埋め込むための設定で、<strong>wmode</strong>の値を<strong>&#8220;transparent&#8221;</strong>や<strong>&#8220;opaque&#8221;</strong>にしていた場合、この方法でリンクボタンの設定をすると、<strong><span style="color:#FF0000;font-size:16px;line-height:22px;">IEで実行した時にポップアップブロックの警告が出てしまい</span></strong>、すんなりリンク先を開く事ができなくなります。</p>
<p>※wmode=&#8221;window&#8221;の場合は問題ないようです。</p>
<p>さてどうするかということで参考になるのが下記の記事。</p>
<p><strong><a href="http://level0.kayac.com/2009/04/ie.php" target="_blank">IEのポップアップブロックのブロック | エントリー | _level0.KAYAC</a></strong></p>
<p><strong><span style="color:#FF0000;font-size:16px;line-height:22px;">ExternalInterfaceを使って、JavaScriptのwindow.openを直接実行する</span></strong>わけですね。となると当然、<strong>wmode=&#8221;transparent&#8221;</strong>の他に、<strong>allowscriptaccess=&#8221;always&#8221;</strong>にする必要が出てきます。</p>
<p>ということで出来たHTML側のテンプレ（swfobject使用）：</p>
<pre class="brush: xml;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;ja&quot; xml:lang=&quot;ja&quot;&gt;
	&lt;head&gt;
		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
		&lt;title&gt;サンプル&lt;/title&gt;
		&lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;text/javascript;&quot; /&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;swfobject.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			var flashvars = {};
			var params = {};
			params.wmode = &quot;transparent&quot;;
			params.allowscriptaccess = &quot;always&quot;;
			var attributes = {};
			swfobject.embedSWF(&quot;sample.swf&quot;, &quot;myAlternativeContent&quot;, &quot;800&quot;, &quot;600&quot;, &quot;9.0.0&quot;, false, flashvars, params, attributes);
		&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div id=&quot;myAlternativeContent&quot;&gt;
			&lt;a href=&quot;http://www.adobe.com/go/getflashplayer_jp&quot;&gt;
				&lt;img src=&quot;http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif&quot; alt=&quot;Get Adobe Flash player&quot; /&gt;
			&lt;/a&gt;
		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<p>SWF側のドキュメントクラスの例：</p>
<pre class="brush: as3;">package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.external.ExternalInterface;

	public class Main extends MovieClip {
		btn.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true);
	}

	public var btn:MovieClip;

	public function onBtnClick(e:MouseEvent):void {
		var url:String = &quot;http://www.tonpoo.com/&quot;;
		ExternalInterface.call(&quot;window.open&quot;,url,&quot;&quot;);
	}
}</pre>
<p>URLRequestの設定をする必要がない分、navigateToURLを使った場合よりも記述がシンプルになっているのが面白いですね。個人的にはwmode=&#8221;transparent&#8221;はあまり使いたくない設定なのですが、コンテンツの仕様上使わざるを得ない事も多いので、忘れないでいたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2010/01/navigatetourl-ie-wmode-transparent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2010/01/navigatetourl-ie-wmode-transparent/" />
	</item>
		<item>
		<title>ByteArrayクラスを使って配列やオブジェクトのコピーを生成する</title>
		<link>http://www.tonpoo.com/blog/2009/12/bytearray/</link>
		<comments>http://www.tonpoo.com/blog/2009/12/bytearray/#comments</comments>
		<pubDate>Fri, 25 Dec 2009 03:57:29 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[actionscript3]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=675</guid>
		<description><![CDATA[まず、&#8221;name&#8221;, &#8220;birth&#8221;, &#8220;part&#8221;というプロパティを持つオブジェクトを生成し、それぞれのプロパティに値を入れる。 var obj1:Object = new Object(); obj1.name = &#34;John&#34;; obj1.birth = 1940; obj1.part = &#34;guitar&#34;; trace(obj1.name); //出力：John 次に、このオブジェクトのコピーを作成し、一部のプロパティを変更するために、以下のスクリプトを実行する。 var obj2:Object = obj1; obj2.name = &#34;George&#34;; obj2.birth = 1943; trace(obj1.name, obj2.name); //出力：George George すると、コピー先（obj2）だけでなく、コピー元（obj1）のプロパティまでも変更されてしまっている。 これは、obj2 = obj1; としたとき、obj1をコピーしているのではなく、obj1への参照を作成しているにすぎないためである。 ・・・というのは実は配列でも同じ事がおこる。で、配列の場合はArray.sliceメソッドを使う事でコピーを作る事ができる（参考：TONPOOBLOG » 配列の（浅い）コピー）んだけど、オブジェクトのコピーを作る時はどうするか？ これまではfor&#8230;inを使ってプロパティをコピーしていました。 var obj2:Object = new Object(); for (var name:String in obj1) { obj2[name] [...]]]></description>
			<content:encoded><![CDATA[<p>まず、&#8221;name&#8221;, &#8220;birth&#8221;, &#8220;part&#8221;というプロパティを持つオブジェクトを生成し、それぞれのプロパティに値を入れる。</p>
<pre class="brush: as3;">var obj1:Object = new Object();
obj1.name = &quot;John&quot;;
obj1.birth = 1940;
obj1.part = &quot;guitar&quot;;
trace(obj1.name);	//出力：John</pre>
<p>次に、このオブジェクトのコピーを作成し、一部のプロパティを変更するために、以下のスクリプトを実行する。</p>
<pre class="brush: as3;">var obj2:Object = obj1;
obj2.name = &quot;George&quot;;
obj2.birth = 1943;
trace(obj1.name, obj2.name);	//出力：George George</pre>
<p>すると、コピー先（obj2）だけでなく、<strong>コピー元（obj1）のプロパティまでも変更されてしまっている。</strong></p>
<p>これは、obj2 = obj1; としたとき、obj1をコピーしているのではなく、<strong>obj1への参照を作成しているにすぎないため</strong>である。<br />
<span id="more-675"></span><br />
・・・というのは実は配列でも同じ事がおこる。で、配列の場合は<strong>Array.sliceメソッド</strong>を使う事でコピーを作る事ができる（参考：<a href="http://www.tonpoo.com/blog/2009/05/array-copy/">TONPOOBLOG » 配列の（浅い）コピー</a>）んだけど、オブジェクトのコピーを作る時はどうするか？</p>
<p>これまでは<strong>for&#8230;in</strong>を使ってプロパティをコピーしていました。</p>
<pre class="brush: as3;">var obj2:Object = new Object();
for (var name:String in obj1) {
	obj2[name] = obj1[name];
}
obj2.name = &quot;George&quot;;
obj2.birth = 1943;
trace(obj1.name, obj2.name);	//出力：John George</pre>
<p>ところが、flash-jpの以下のスレッドで<strong>ByteArrayクラス</strong>というのがあることを発見。</p>
<p><strong><a href="http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=9176&#038;forum=6&#038;post_id=44188#forumpost44188" target="_blank">FLASH-JP.COM &#8211; フォーラム Re: SharedObjectで任意のデータを保存したい</a></strong></p>
<p>早速ヘルプを参照。</p>
<p><strong><a href="http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/utils/ByteArray.html" target="_blank">ByteArray &#8211; ActionScript 3.0 コンポーネントリファレンスガイド</a></strong></p>
<p>よくわからないけど、こういうことかな？</p>
<pre class="brush: as3;">//ByteArrayインスタンスを生成
var myByteArray:ByteArray = new ByteArray();
//コピー元ObjectのバイナリデータをByteArrayインスタンスに書き込み
myByteArray.writeObject(obj1);
//ByteArrayインスタンスのデータをコピー先Objectに読み込み
var obj2:Object = myByteArray.readObject();</pre>
<p>と思ったら、以下のエラーが。</p>
<blockquote><p>Error: Error #2030: ファイルの終端 (EOF) が検出されました。<br />
	at flash.utils::ByteArray/readObject()<br />
	at Sample()</p></blockquote>
<p><del>どうやら、先のflash-jpのnekoyukiさんの投稿にもあったように、一度<strong>ByteArray.compress</strong>→<strong>ByteArray.uncompress</strong>しないとダメなようですね。</del></p>
<p>わざわざ圧縮→解凍などという手間をかけずとも、<strong>ByteArray.positionプロパティ</strong>の値を0にし、<strong>ByteArrayのファイルポインタの位置を先頭に戻す</strong>ことで対応できました！（flash-jpのスレッドでの野中先生のレスから判明しました。野中先生ありがとうございます！）</p>
<pre class="brush: as3;">//ByteArrayインスタンスを生成
var myByteArray:ByteArray = new ByteArray();
//コピー元ObjectのバイナリデータをByteArrayインスタンスに書き込み
myByteArray.writeObject(obj1);
//ByteArrayのファイルポインタの位置を先頭に移す
myByteArray.position = 0;
//ByteArrayインスタンスのデータをコピー先Objectに読み込み
var obj2:Object = myByteArray.readObject();

trace(obj2.name, obj2.birth, obj2.part);	//出力：John 1940 guitar</pre>
<p>となると、同じくflash-jpのnekoyukiさんの書いたように、メソッドにしてしまったほうが楽そうです。配列のコピーにも使えますしね。ということでできあがったサンプル用のドキュメントクラス（Sample.as）は以下の通り。</p>
<pre class="brush: as3;">package  {
	import flash.display.MovieClip;
	import flash.utils.ByteArray;

	public class Sample extends MovieClip{

		public function Sample() {
			var obj1:Object = new Object();
			obj1.name = &quot;John&quot;;
			obj1.birth = 1940;
			obj1.part = &quot;guitar&quot;;

			var obj2:Object = byteCopy(obj1);
			obj2.name = &quot;George&quot;;
			obj2.birth = 1942;
			trace(obj1.name, obj2.name);	//出力：John George

			var array1:Array = [&quot;John&quot;, &quot;Paul&quot;, &quot;George&quot;, &quot;Ringo&quot;];
			var array2:Array = byteCopy(array1);
			array2[3] = &quot;Stuart&quot;;
			trace(array1);	//出力：John,Paul,George,Ringo
			trace(array2);	//出力：John,Paul,George,Stuart
		}

		//バイナリデータのコピーメソッド
		public function byteCopy(objFrom:*):*{
			//ByteArrayインスタンスを生成
			var myByteArray:ByteArray = new ByteArray();
			//コピー元ObjectのバイナリデータをByteArrayインスタンスに書き込み
			myByteArray.writeObject(objFrom);
			//ByteArrayのファイルポインタの位置を先頭に移す
			myByteArray.position = 0;
			//ByteArrayインスタンスのデータを返す
			return myByteArray.readObject();
		}
	}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2009/12/bytearray/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2009/12/bytearray/" />
	</item>
		<item>
		<title>FlashからExternalInterfaceクラスを使ってLightboxを呼び出す</title>
		<link>http://www.tonpoo.com/blog/2009/12/flash-externalinterface-lightbox/</link>
		<comments>http://www.tonpoo.com/blog/2009/12/flash-externalinterface-lightbox/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 13:55:06 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[actionscript2]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[swfobject]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=649</guid>
		<description><![CDATA[「Flash（swf）からLightboxを呼び出す」というニーズがこれまでに何回かあり、またついさっきもあって、その都度ちょっと面倒だったりしたのでメモ。なお、ウチの会社ではswfファイルの埋め込みには通常swfobject2を使ってるので、以下は「Lightbox2.04 + swfobject2 + ActionScript（ExternalInterfaceクラス）」という組み合わせが前提となっています。 Lightboxを入手 まず使用するLightboxのバージョンは2.04。Lokesh Dhakar氏によるLightbox 2の公式サイトで入手。 ベースHTMLの作成 次にベースとなるHTMLを作成。今回はとりあえずSWFObject 2 HTML and JavaScript ジェネレーターを使ってサクっと作りました。ポイントとしては、「SWFの定義」のオプションを一部変更すること。 まず、Lightboxを表示した際に、swfコンテンツが上に来てしまうのを避けるため、wmodeをtransparentに設定。また、ExternalInterfaceクラスを使うので、allowscriptaccessをalwaysに設定。できあがったHTMLは下記の通り： &#60;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#34;&#62; &#60;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34; lang=&#34;ja&#34; xml:lang=&#34;ja&#34;&#62; &#60;head&#62; &#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&#62; &#60;title&#62;&#60;/title&#62; &#60;meta http-equiv=&#34;Content-Script-Type&#34; content=&#34;text/javascript;&#34; /&#62; &#60;script type=&#34;text/javascript&#34; src=&#34;swfobject.js&#34;&#62;&#60;/script&#62; &#60;script type=&#34;text/javascript&#34;&#62; var flashvars = {}; var params = {}; params.wmode = [...]]]></description>
			<content:encoded><![CDATA[<p>「Flash（swf）からLightboxを呼び出す」というニーズがこれまでに何回かあり、またついさっきもあって、その都度ちょっと面倒だったりしたのでメモ。なお、ウチの会社ではswfファイルの埋め込みには通常swfobject2を使ってるので、以下は<strong>「Lightbox2.04 + swfobject2 + ActionScript（ExternalInterfaceクラス）」</strong>という組み合わせが前提となっています。</p>
<h3>Lightboxを入手</h3>
<p>まず使用するLightboxのバージョンは2.04。<strong><a href="http://www.huddletogether.com/projects/lightbox2/#download" target="_blank">Lokesh Dhakar氏によるLightbox 2の公式サイト</a></strong>で入手。</p>
<h3>ベースHTMLの作成</h3>
<p>次にベースとなるHTMLを作成。今回はとりあえず<strong><a href="http://www.tonpoo.com/docs/swfobject_generator/" target="_blank">SWFObject 2 HTML and JavaScript ジェネレーター</a></strong>を使ってサクっと作りました。ポイントとしては、「SWFの定義」のオプションを一部変更すること。<br />
<img src="http://www.tonpoo.com/blog/wp-content/uploads/2009/12/ss1.jpg" alt="ss1" title="ss1" width="350" height="287" class="alignnone size-full wp-image-656" /></p>
<p><span id="more-649"></span></p>
<p>まず、Lightboxを表示した際に、swfコンテンツが上に来てしまうのを避けるため、wmodeをtransparentに設定。また、ExternalInterfaceクラスを使うので、allowscriptaccessをalwaysに設定。できあがったHTMLは下記の通り：</p>
<pre class="brush: xml;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;ja&quot; xml:lang=&quot;ja&quot;&gt;
	&lt;head&gt;
		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
		&lt;title&gt;&lt;/title&gt;
		&lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;text/javascript;&quot; /&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;swfobject.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			var flashvars = {};
			var params = {};
			params.wmode = &quot;transparent&quot;;
			params.allowscriptaccess = &quot;always&quot;;
			var attributes = {};
			swfobject.embedSWF(&quot;sample.swf&quot;, &quot;myAlternativeContent&quot;, &quot;800&quot;, &quot;600&quot;, &quot;9.0.0&quot;, false, flashvars, params, attributes);
		&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div id=&quot;myAlternativeContent&quot;&gt;
			&lt;a href=&quot;http://www.adobe.com/go/getflashplayer_jp&quot;&gt;
				&lt;img src=&quot;http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif&quot; alt=&quot;Get Adobe Flash player&quot; /&gt;
			&lt;/a&gt;
		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<h3>Lightbox用のライブラリを組み込み</h3>
<p>上記のベースHTMLのheadセクションに、Lightbox動作のためのjsファイルとcssファイルを組み込む下記の記述を追加。</p>
<pre class="brush: xml;">&lt;script type=&quot;text/javascript&quot; src=&quot;js/prototype.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/scriptaculous.js?load=effects,builder&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/lightbox.js&quot;&gt;&lt;/script&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;css/lightbox.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;</pre>
<h3>Lightboxを起動させるJavaScriptメソッドを追加</h3>
<p>Lightboxを直接起動させるJavaScriptのメソッドがないので、下記ページを参考にそのためのメソッドを追加。</p>
<p><strong><a href="http://blog.codefidelity.com/?p=16" target="_blank">Execute Lightbox Scripts From Flash at Codefidelity</a></strong><br />
（情報元：<strong><a href="http://d.hatena.ne.jp/minorio/20080927/1222513402" target="_blank">Flash から Lightbox を起動する方法 &#8211; minorio のプログラミング・メモ</a></strong>）</p>
<p>具体的に追加する内容は下記の通り。</p>
<pre class="brush: xml;">&lt;script type=&quot;text/javascript&quot;&gt;
function LightboxDelegate(url,caption) {
	var objLink = document.createElement('a');
	objLink.setAttribute('href',url);
	objLink.setAttribute('rel','lightbox');
	objLink.setAttribute('title',caption);
	Lightbox.prototype.start(objLink);
}
&lt;/script&gt;
</pre>
<p>最終的にできあがったhtmlは下記の通り。</p>
<pre class="brush: xml;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;ja&quot; xml:lang=&quot;ja&quot;&gt;
	&lt;head&gt;
		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
		&lt;title&gt;&lt;/title&gt;
		&lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;text/javascript;&quot; /&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;swfobject.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;js/prototype.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;js/scriptaculous.js?load=effects,builder&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;js/lightbox.js&quot;&gt;&lt;/script&gt;
		&lt;link rel=&quot;stylesheet&quot; href=&quot;css/lightbox.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			//swfobject関係
			var flashvars = {};
			var params = {};
			params.wmode = &quot;transparent&quot;;
			params.allowscriptaccess = &quot;always&quot;;
			var attributes = {};
			swfobject.embedSWF(&quot;sample.swf&quot;, &quot;myAlternativeContent&quot;, &quot;600&quot;, &quot;400&quot;, &quot;9.0.0&quot;, false, flashvars, params, attributes);
			//LightboxDelegate関係
			function LightboxDelegate(url,caption) {
				var objLink = document.createElement('a');
				objLink.setAttribute('href',url);
				objLink.setAttribute('rel','lightbox');
				objLink.setAttribute('title',caption);
				Lightbox.prototype.start(objLink);
			}
		&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div id=&quot;myAlternativeContent&quot;&gt;
			&lt;a href=&quot;http://www.adobe.com/go/getflashplayer_jp&quot;&gt;
				&lt;img src=&quot;http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif&quot; alt=&quot;Get Adobe Flash player&quot; /&gt;
			&lt;/a&gt;
		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<h3>ExternalInterfaceで呼び出し</h3>
<p>次はFlash側の用意。sample.flaというファイル（ActionScript3）を用意、ステージ上にボタン用のMovieClipインスタンスを３つ配置し、それぞれbtn0, btn1, btn2という名前を付ける。sample.flaのドキュメントクラスとしてSampleクラスを指定。Sample.asの内容は下記の通り。</p>
<pre class="brush: as3;">package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.external.ExternalInterface;

	public class Sample extends MovieClip{
		public function Sample() {
			//Lightbox用の設定
			lightboxArray = new Array();
			lightboxArray[0] = {
				src:&quot;images/photo0.jpg&quot;,
				caption:&quot;写真その0&quot;
			};
			lightboxArray[1] = {
				src:&quot;images/photo1.jpg&quot;,
				caption:&quot;写真その1&quot;
			};
			lightboxArray[2] = {
				src:&quot;images/photo2.jpg&quot;,
				caption:&quot;写真その2&quot;
			};
			//ボタンの設定
			for (var i:uint = 0; i &lt; 3; i++) {
				var btn:MovieClip = this[&quot;btn&quot; + i];
				btn.id = i;
				btn.buttonMode = true;
				btn.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true);
			}
		}

		public var lightboxArray:Array;
		public var btn0:MovieClip;
		public var btn1:MovieClip;
		public var btn2:MovieClip;

		//ボタン用メソッド
		public function onBtnClick(e:MouseEvent):void {
			var btn:MovieClip = e.target as MovieClip;
			var id:uint = btn.id;
			var src:String = lightboxArray[id].src;
			var caption:String = lightboxArray[id].caption;
			//LightboxDelegateメソッドを呼び出し
			ExternalInterface.call(&quot;LightboxDelegate&quot;,src,caption );
		}
	}
}</pre>
<p>これで完成！</p>
<h3>オマケ：IE7～8でのLightboxの表示バグフィックス</h3>
<p>Lightboxを使った縦に長いページをIEで閲覧した場合、ページをスクロールしてからLightboxを起動すると、Lightboxの背景（黒い透過）部分が途中で切れてしまう。これを回避するためにとりあえずやったのが<strong>lightbox.css</strong>の改造。具体的には#overlayのpositionをabsoluteからfixに変更（+IE6ではおかしくなってしまうので、スターハックを使ってabsoluteのまま）部分を下記のようにしました。</p>
<pre class="brush: css;">#overlay {
	position: fixed;
	top: 0;
	left: 0;
	z-index: 90;
	width: 100%;
	height: 500px;
	background-color: #000;
}
* html #overlay {
	position: absolute;
}</pre>
<p>以上、備忘録もかねて参考までに。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2009/12/flash-externalinterface-lightbox/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2009/12/flash-externalinterface-lightbox/" />
	</item>
		<item>
		<title>ActionScriptで別ドメインの画像を読み込んで「使う」ときの注意点</title>
		<link>http://www.tonpoo.com/blog/2009/12/actionscript-y/</link>
		<comments>http://www.tonpoo.com/blog/2009/12/actionscript-y/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 10:59:26 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[troubles]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=666</guid>
		<description><![CDATA[別ドメインにある画像やxmlを読み込んで処理するswfコンテンツの制作中。ポリシーファイルが必要なのはわかっていたので、画像やxmlの置いてあるサーバー（http://www.sample.server/）のルートに下記のcrossdomain.xmlを設置。 &#60;?xml version=&#34;1.0&#34;?&#62; &#60;!DOCTYPE cross-domain-policy SYSTEM &#34;http://www.adobe.com/xml/dtds/cross-domain-policy.dtd&#34;&#62; &#60;cross-domain-policy&#62; &#60;allow-access-from domain=&#34;*&#34; secure=&#34;true&#34; /&#62; &#60;/cross-domain-policy&#62; でもって、swfの方から上記サーバーのrss（http://www.sample.server/rss.php）を読み込んだ所、問題ナシ！ 続けて、JPEGファイルを読み込み、BitmapData.draw()で描画しようと思った所： セキュリティサンドボックス侵害 : BitmapData.draw:http://www.tonpoo.com/hogehoge/foobar.swf は http://www.sample.server/images/photo.jpg にアクセスできません。ポリシーファイルが必要ですが、このメディアがロードされたとき、checkPolicyFile フラグが設定されませんでした。 あれえええええ？ おかしいなと思って調べてみたら、出てきた： AS で別ドメインの画像を読み込むときの注意点 &#8211; てっく煮ブログ クロスドメインポリシーファイルは設置してるけどなあ、と思いながら読んでいると下記の記述： これ以外に、Security.loadPolicyFile() メソッドを使って、事前に読み込んでおく方法もある。 これだこれだ！というわけで早速リファレンスを参照。 Security &#8211; ActionScript 3.0 コンポーネントリファレンスガイド でもって下記の記述を追加（www付きの場合とナシの場合と両方対応するように両方を併記）。 Security.loadPolicyFile(&#34;http://sample.server/crossdomain.xml&#34;); Security.loadPolicyFile(&#34;http://www.sample.server/crossdomain.xml&#34;); そしたら無事解決！ crossdomain.xmlを用意しただけで安心してちゃいかんですね・・]]></description>
			<content:encoded><![CDATA[<p>別ドメインにある画像やxmlを読み込んで処理するswfコンテンツの制作中。ポリシーファイルが必要なのはわかっていたので、画像やxmlの置いてあるサーバー（http://www.sample.server/）のルートに下記のcrossdomain.xmlを設置。</p>
<pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;!DOCTYPE cross-domain-policy SYSTEM &quot;http://www.adobe.com/xml/dtds/cross-domain-policy.dtd&quot;&gt;
&lt;cross-domain-policy&gt;
	&lt;allow-access-from domain=&quot;*&quot; secure=&quot;true&quot; /&gt;
&lt;/cross-domain-policy&gt;</pre>
<p>でもって、swfの方から上記サーバーのrss（http://www.sample.server/rss.php）を読み込んだ所、問題ナシ！</p>
<p>続けて、JPEGファイルを読み込み、BitmapData.draw()で描画しようと思った所：</p>
<blockquote><p><strong>セキュリティサンドボックス侵害 : BitmapData.draw:http://www.tonpoo.com/hogehoge/foobar.swf は http://www.sample.server/images/photo.jpg にアクセスできません。ポリシーファイルが必要ですが、このメディアがロードされたとき、checkPolicyFile フラグが設定されませんでした。</strong></p></blockquote>
<p><span style="font-size:30px;line-height:40px;font-weight:bold;color:#ff0000;">あれえええええ？</span></p>
<p>おかしいなと思って調べてみたら、出てきた：</p>
<p><strong><a href="http://d.hatena.ne.jp/nitoyon/20071112/crossdomain_img" target="_blank">AS で別ドメインの画像を読み込むときの注意点 &#8211; てっく煮ブログ</a></strong></p>
<p>クロスドメインポリシーファイルは設置してるけどなあ、と思いながら読んでいると下記の記述：</p>
<blockquote><p>これ以外に、<strong>Security.loadPolicyFile() </strong>メソッドを使って、事前に読み込んでおく方法もある。</p></blockquote>
<p>これだこれだ！というわけで早速リファレンスを参照。</p>
<p><strong><a href="http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/system/Security.html#loadPolicyFile()" target="_blank">Security &#8211; ActionScript 3.0 コンポーネントリファレンスガイド</a></strong></p>
<p>でもって下記の記述を追加（www付きの場合とナシの場合と両方対応するように両方を併記）。</p>
<pre class="brush: as3;">Security.loadPolicyFile(&quot;http://sample.server/crossdomain.xml&quot;);
Security.loadPolicyFile(&quot;http://www.sample.server/crossdomain.xml&quot;);</pre>
<p>そしたら無事解決！</p>
<p>crossdomain.xmlを用意しただけで安心してちゃいかんですね・・</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2009/12/actionscript-y/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2009/12/actionscript-y/" />
	</item>
		<item>
		<title>ECMAScript 第5版承認－ActionScript次期バージョンはどうなるか？</title>
		<link>http://www.tonpoo.com/blog/2009/12/ecmascript-5-actionscript/</link>
		<comments>http://www.tonpoo.com/blog/2009/12/ecmascript-5-actionscript/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 10:40:58 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[actionscript2]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[topics]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=646</guid>
		<description><![CDATA[前にECMAScript HarmonyとActionScriptという記事を書きましたが、そのECMAScriptの最新版、ECMA-262第5版の仕様策定が完了したそうです。 ・ECMAScript 第5版 承認 &#8211; スラッシュドット・ジャパン ・InfoQ: ECMAScript 5リリース 上記ページを読んでも正直よくわかんないんですが、前者の記事では Microsoft/Yahooが主導するマイナーチェンジとバグフィックスが主のECMAScript 3.1と、 Adobe/Mozilla/Opera/Googleが主導する野心的な機能拡張である ECMAScript 4の間で対立があったが、 ECMAScript Harmonyと呼ばれる統合計画によって ES3.1をベースに ES4のサブセットを取り込む形で両者が合意した経緯がある。 ・・・と書かれている一方、後者の記事では ECMAScript 4を合理化しようという初期の試みは大失敗に終わった。結局、Adobe社のActionScriptだけが提案された変更点に対応しただけだった。 ・・・と書かれています。これはつまり、 ●ECMAScript本体の方は3.1をベースにES4の一部機能（仕様）を取り込むにとどまった。 ●ES4に対応したのはActionScriptだけだった。 ・・・というようなことなんでしょうか？ とりあえず、ActionScript次期バージョンへの影響が心配されます。AS3にやっと慣れてきた手前、この学習資産が無駄にならなきゃいいんだけど・・・。]]></description>
			<content:encoded><![CDATA[<p>前に<strong><a href="http://www.tonpoo.com/blog/2009/07/ecmascript-harmony-actionscript/">ECMAScript HarmonyとActionScript</a></strong>という記事を書きましたが、そのECMAScriptの最新版、<strong>ECMA-262第5版</strong>の仕様策定が完了したそうです。</p>
<p><strong>・<a href="http://slashdot.jp/developers/article.pl?sid=09/12/19/0113202" target="_blank">ECMAScript 第5版 承認 &#8211; スラッシュドット・ジャパン</a></strong><br />
<strong>・<a href="http://www.infoq.com/jp/news/2009/12/ecmascript5" target="_blank">InfoQ: ECMAScript 5リリース</a></strong></p>
<p>上記ページを読んでも正直よくわかんないんですが、前者の記事では</p>
<blockquote><p>Microsoft/Yahooが主導するマイナーチェンジとバグフィックスが主のECMAScript 3.1と、 Adobe/Mozilla/Opera/Googleが主導する野心的な機能拡張である ECMAScript 4の間で対立があったが、 ECMAScript Harmonyと呼ばれる統合計画によって <strong>ES3.1をベースに ES4のサブセットを取り込む形で両者が合意した</strong>経緯がある。</p></blockquote>
<p>・・・と書かれている一方、後者の記事では</p>
<blockquote><p>ECMAScript 4を合理化しようという初期の試みは大失敗に終わった。結局、<strong>Adobe社のActionScriptだけが提案された変更点に対応した</strong>だけだった。</p></blockquote>
<p>・・・と書かれています。これはつまり、<br />
●ECMAScript本体の方は3.1をベースにES4の一部機能（仕様）を取り込むにとどまった。<br />
●ES4に対応したのはActionScriptだけだった。<br />
・・・というようなことなんでしょうか？</p>
<p>とりあえず、ActionScript次期バージョンへの影響が心配されます。AS3にやっと慣れてきた手前、この学習資産が無駄にならなきゃいいんだけど・・・。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2009/12/ecmascript-5-actionscript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2009/12/ecmascript-5-actionscript/" />
	</item>
		<item>
		<title>addEventListenerの書き方の定番</title>
		<link>http://www.tonpoo.com/blog/2009/12/addeventlistener/</link>
		<comments>http://www.tonpoo.com/blog/2009/12/addeventlistener/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 02:19:36 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[actionscript3]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=636</guid>
		<description><![CDATA[昨日の「ステージのインスタンスを自動宣言」に続いて、AS3の開発ですぐ忘れてしまう件について、備忘録をかねて。ボタンアクションやらENTER_FRAMEやらの処理を行う際など、頻繁に使うのが「イベントリスナの登録」。例えばステージ上にbtn_mcというMovieClipがあったとして、このボタンをクリックしたらonBtnClickというメソッドを実行させたいというような場合、通常は下記のように記述します。 btn_mc.addEventListener(MouseEvent.CLICK, onBtnClick); これを、addEventListenerの5つめの引数をtrueにする（3つめはfalse、4つめは0）ことで、より効率的なメモリ管理を実現出来ます。 btn_mc.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true); 詳しくは上条氏の下記記事を参照下さい。 イベントリスナ （AS3） とガーベジコレクション &#8211; akihiro kamijo]]></description>
			<content:encoded><![CDATA[<p>昨日の「ステージのインスタンスを自動宣言」に続いて、AS3の開発ですぐ忘れてしまう件について、備忘録をかねて。ボタンアクションやらENTER_FRAMEやらの処理を行う際など、頻繁に使うのが「イベントリスナの登録」。例えばステージ上にbtn_mcというMovieClipがあったとして、このボタンをクリックしたらonBtnClickというメソッドを実行させたいというような場合、通常は下記のように記述します。</p>
<pre class="brush: as3;">btn_mc.addEventListener(MouseEvent.CLICK, onBtnClick);</pre>
<p>これを、addEventListenerの<strong><span style="color:#ff0000;">5つめの引数をtrueにする</span></strong>（3つめは<strong>false</strong>、4つめは<strong>0</strong>）ことで、より効率的なメモリ管理を実現出来ます。</p>
<pre class="brush: as3;">btn_mc.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true);</pre>
<p>詳しくは上条氏の下記記事を参照下さい。</p>
<p><strong><a href="http://blogs.adobe.com/akamijo/archives/2007/05/post_19.html" target="_blank">イベントリスナ （AS3） とガーベジコレクション &#8211; akihiro kamijo</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2009/12/addeventlistener/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2009/12/addeventlistener/" />
	</item>
		<item>
		<title>ステージのインスタンスを自動宣言</title>
		<link>http://www.tonpoo.com/blog/2009/12/as3_stage_instance/</link>
		<comments>http://www.tonpoo.com/blog/2009/12/as3_stage_instance/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 09:55:41 +0000</pubDate>
		<dc:creator>tonpoo</dc:creator>
				<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[troubles]]></category>

		<guid isPermaLink="false">http://www.tonpoo.com/blog/?p=625</guid>
		<description><![CDATA[ああ腹立たしい！！ActionScript3での開発もそれなりにやってきてるというのに、今でも結構単純な作業を行うのに思い通りにいかず、ストレスを感じることがあります。 今回は「ステージのインスタンスを自動宣言」について。 例えばtest.flaのステージ上にmy_mcというインスタンス名のMovieClipインスタンスと、my_txtというTextFieldインスタンスがあったとします。 で、test.flaのドキュメントクラスとして、Testというクラスを設定しているとします。ステージ上にMovieClipとTextFieldを配置しているので、これらのクラスもimportしています。 package{ import flash.display.MovieClip; import flash.text.TextField; class Test extends MovieClip { var my_mc:MovieClip; var my_txt:TextField; function Test() { } } } 上記の状態でプレビューすると、以下のエラーが出ます。 1151: 定義 my_mc (名前空間 internal) にコンフリクトが存在します。 1151: 定義 my_txt (名前空間 internal) にコンフリクトが存在します。 この点についての説明は、野中先生の下記ページが詳しいです。 F-site &#124; [AS3] オーサリング時に配置されたインスタンスの型指定 さて、上記に従って、クラスそのものと、ステージに配置済みのmy_mc、my_txtに対してpublic指定してみます。 package{ import flash.display.MovieClip; import flash.text.TextField; public class Test extends MovieClip { public [...]]]></description>
			<content:encoded><![CDATA[<p><strong>ああ腹立たしい！！</strong>ActionScript3での開発もそれなりにやってきてるというのに、今でも結構単純な作業を行うのに思い通りにいかず、ストレスを感じることがあります。</p>
<p>今回は「<strong>ステージのインスタンスを自動宣言</strong>」について。</p>
<p><span id="more-625"></span></p>
<p>例えばtest.flaのステージ上にmy_mcというインスタンス名のMovieClipインスタンスと、my_txtというTextFieldインスタンスがあったとします。</p>
<p>で、test.flaのドキュメントクラスとして、Testというクラスを設定しているとします。ステージ上にMovieClipとTextFieldを配置しているので、これらのクラスもimportしています。</p>
<pre class="brush: as3;">package{
	import flash.display.MovieClip;
	import flash.text.TextField;

	class Test extends MovieClip {
		var my_mc:MovieClip;
		var my_txt:TextField;

		function Test() {

		}
	}
}</pre>
<p>上記の状態でプレビューすると、以下のエラーが出ます。</p>
<blockquote><p>1151: 定義 my_mc (名前空間 internal) にコンフリクトが存在します。<br />
1151: 定義 my_txt (名前空間 internal) にコンフリクトが存在します。</p></blockquote>
<p>この点についての説明は、野中先生の下記ページが詳しいです。</p>
<p><strong><a href="http://f-site.org/articles/2007/02/12150755.html" target="_blank">F-site | [AS3] オーサリング時に配置されたインスタンスの型指定</a></strong></p>
<p>さて、上記に従って、クラスそのものと、ステージに配置済みのmy_mc、my_txtに対してpublic指定してみます。</p>
<pre class="brush: as3;">package{
	import flash.display.MovieClip;
	import flash.text.TextField;

	public class Test extends MovieClip {
		public var my_mc:MovieClip;
		public var my_txt:TextField;

		function Test() {

		}
	}
}</pre>
<p>「おお、これでＯＫ！」と思ってプレビューしてみると・・・</p>
<blockquote><p>1151: 定義 my_mc (名前空間 internal) にコンフリクトが存在します。<br />
1151: 定義 my_txt (名前空間 internal) にコンフリクトが存在します。</p></blockquote>
<p>えええ！？まだかよ！？きちんとpublic指定してるのに！なんで？そう言えば前にもこんな事あったな。どうやったっけ・・・？？</p>
<p>・・・とパニクるなかれ、KAYACさんのブログの下記記事に書いてあります。</p>
<p><strong><a href="http://level0.kayac.com/2009/02/autodefination_jsfl.php" target="_blank">ステージのインスタンスを自動宣言するかどうか | エントリー | _level0.KAYAC</a></strong></p>
<p>そう、諸悪の根源は「<strong>ステージのインスタンスを自動宣言</strong>」のオプションでした。</p>
<p><img src="http://www.tonpoo.com/blog/wp-content/uploads/2009/12/ss1.png" alt="ss1" title="ss1" width="459" height="442" class="alignnone size-full wp-image-631" /></p>
<p>ここのチェックを外して、改めてプレビュー。すると・・・</p>
<p><strong>エラーが無くなります！</strong></p>
<p>ああよかった。それにしてもクラスベースで開発する場合、このオプションは邪魔ですね。KAYACさんのブログにあるように、宣言のないものだけ補完してくれたらいいのに・・・。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tonpoo.com/blog/2009/12/as3_stage_instance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tonpoo.com/blog/2009/12/as3_stage_instance/" />
	</item>
	</channel>
</rss>
