<?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/"
	>

<channel>
	<title>Rest Term &#187; tips</title>
	<atom:link href="http://rest-term.com/archives/tag/tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://rest-term.com</link>
	<description>Web関連技術や雑記など</description>
	<lastBuildDate>Sat, 04 Sep 2010 16:19:38 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>CSSの解釈について</title>
		<link>http://rest-term.com/archives/2786/</link>
		<comments>http://rest-term.com/archives/2786/#comments</comments>
		<pubDate>Wed, 05 May 2010 14:16:58 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2786</guid>
		<description><![CDATA[業務の合間に制作部の社内勉強会にちょこちょこ参加していろいろ学んだのでメモ。 ここではCSSの最適化について。 * ブラウザはCSSをどう解釈している？ ルールを照合するとき、右端のセレクタから調べ始めて、順に左のセレクタを調べていく。 ということは、 [css] #contents > li { font-weight: bold; } [/css] のようなルールの場合「contents という id を持つ要素を探して、その直接の子要素が li 要素かどうかを調べる」ではなく「すべての li 要素について、その直接の親要素が contents という id を持つかを調べる」となり高コストです。子孫セレクタの場合はさらに高くつき、 [css] #contents a { color: #0099ff; } [/css] のようなルールの場合「すべての a 要素について、contents という id を持つ祖先要素をツリー構造をさかのぼって探す」ということになります。子供セレクタであれば1つ上の階層のノードだけ調べれば済みますが、子孫セレクタの場合はさらにさかのぼって探索しなければなりません。Win IE6対応を無視してもいいなら、子孫セレクタから子供セレクタに置き換えた方がいいです。ただ、その子供セレクタも高コストには違いないので、それを1つの class に置き換えます。 [css] #contents > li > a { font-weight: bold; } [/css] [...]]]></description>
			<content:encoded><![CDATA[<p>業務の合間に制作部の社内勉強会にちょこちょこ参加していろいろ学んだのでメモ。<br />
ここではCSSの最適化について。</p>
<p>* <strong>ブラウザはCSSをどう解釈している？</strong><br />
ルールを照合するとき、右端のセレクタから調べ始めて、順に左のセレクタを調べていく。</p>
<p>ということは、<br />
[css]<br />
#contents > li { font-weight: bold; }<br />
[/css]<br />
のようなルールの場合「contents という id を持つ要素を探して、その直接の子要素が li 要素かどうかを調べる」ではなく「すべての li 要素について、その直接の親要素が contents という id を持つかを調べる」となり高コストです。子孫セレクタの場合はさらに高くつき、<br />
[css]<br />
#contents a { color: #0099ff; }<br />
[/css]<br />
のようなルールの場合「すべての a 要素について、contents という id を持つ祖先要素をツリー構造をさかのぼって探す」ということになります。子供セレクタであれば1つ上の階層のノードだけ調べれば済みますが、子孫セレクタの場合はさらにさかのぼって探索しなければなりません。Win IE6対応を無視してもいいなら、子孫セレクタから子供セレクタに置き換えた方がいいです。ただ、その子供セレクタも高コストには違いないので、それを1つの class に置き換えます。<br />
[css]<br />
#contents > li > a { font-weight: bold; }<br />
[/css]<br />
ではなく<br />
[css]<br />
.list-anchor { font-weight: bold; }<br />
[/css]<br />
のように要素と関連づけた名前で class を作ってスタイルを適用させることで、探索時間をさらに短くすることができます。</p>
<p>* <strong>ユニバーサルセレクタについて</strong><br />
[css]<br />
* { margin: 0; padding: 0; }<br />
[/css]<br />
一時期よく使われていたユニバーサルセレクタは最近では見かけなくなりました。社内の制作さんは、「パフォーマンスが悪くなる」という点よりも「ブラウザのデフォルトのスタイルを活かす」という点の方を重視しているみたいでしたが、ここまで述べてきた内容からパフォーマンスも相当悪くなるのは明らかです。その点について stevesouders.com さんが検証していました。<br />
<a href="http://stevesouders.com/efws/css-selectors/universal.php" title="CSS Selectors: Universal">CSS Selectors: Universal</a><br />
上述の子供セレクタや子孫セレクタによる読み込み時間の違いは小さなものですが、ユニバーサルセレクタを使用した場合はケタ違いに読み込みが遅くなっています。</p>
<p>* <strong>リフロー時間について</strong><br />
ブラウザがスタイルを適用し要素をレイアウトするのにかかる時間をリフロー時間と呼ぶそうです。スタイルの適用はページの読み込み時のみとは限りません。というのは、最近のWebサイトはJavascriptを多用していて、リッチな表現を行うためにDOM要素の style プロパティを頻繁に書き換えている例が多く見られます。<br />
[javascript]<br />
document.getElementById(&#8220;id&#8221;).style.property=&#8221;value&#8221;<br />
// 例<br />
document.getElementById(&#8220;contents&#8221;).style.fontSize = &#8220;larger&#8221;;</p>
<p>// 実際は上記のような処理がラップされたjQueryなどのライブラリを利用している場合が多い<br />
// 制作工数とパフォーマンスのバランスを考えて使う<br />
$(&#8220;#contents&#8221;).css(&#8220;border&#8221;, &#8220;1px solid #333333&#8243;);<br />
[/javascript]<br />
style プロパティを書き換えるとブラウザはその度にルールを照合しなおしています。もし、DOM要素が body などの多くの子孫を持つ要素の場合、効率の悪いセレクタがあるとページの反応が遅くなってしまいます。ページの読み込み時だけでなくWebアプリケーションがユーザと情報をやりとりしている間の動作に及ぶ影響にも注意することが重要です。</p>
<p>参加したのは新卒向けの勉強会だったので得られたのはこの程度の内容ですが、通常業務でも制作さんといっしょに仕事する機会ができたので、もう少し深い部分も聞いてみたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2786/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Vector複製時のfixed</title>
		<link>http://rest-term.com/archives/1900/</link>
		<comments>http://rest-term.com/archives/1900/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 09:58:30 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=1900</guid>
		<description><![CDATA[もしかして既によく知られていることなのかもしれませんが； [as] var vector1:Vector. = new Vector.(256, true); ・・・ var vector2:Vector. = vector1.concat(); // vector1を複製 trace(vector1.fixed, vector1.length); trace(vector2.fixed, vector2.length); [/as] ・出力結果 true 256 false 256 vector1はpop()やpush()をするとRangeErrorとなりますが、vector2はエラーがでません。 これはconcat()だけでなくslice()で複製した場合も同じで、要素のみコピーされるようです。 長さを固定したい場合は vector2.fixed = true; っていちいち書かないといけないのかな。 ＜追記＞ kenさんのご指摘よりグローバル関数を使ってみると、、 [as] var vector1:Vector. = new Vector.(256, true); ・・・ var vector2:Vector. = Vector.(vector1); // vector1を複製 trace(vector1.fixed, vector1.length); trace(vector2.fixed, vector2.length); [/as] ・出力結果 true [...]]]></description>
			<content:encoded><![CDATA[<p>もしかして既によく知られていることなのかもしれませんが；</p>
<p>[as]<br />
var vector1:Vector.<Number> = new Vector.<Number>(256, true);<br />
・・・<br />
var vector2:Vector.<Number> = vector1.concat(); // vector1を複製<br />
trace(vector1.fixed, vector1.length);<br />
trace(vector2.fixed, vector2.length);<br />
[/as]<br />
・出力結果</p>
<pre>
true 256
false 256
</pre>
<p>vector1はpop()やpush()をするとRangeErrorとなりますが、vector2はエラーがでません。<br />
これはconcat()だけでなくslice()で複製した場合も同じで、要素のみコピーされるようです。<br />
長さを固定したい場合は vector2.fixed = true; っていちいち書かないといけないのかな。</p>
<p>＜追記＞<br />
kenさんのご指摘よりグローバル関数を使ってみると、、<br />
[as]<br />
var vector1:Vector.<Number> = new Vector.<Number>(256, true);<br />
・・・<br />
var vector2:Vector.<Number> = Vector.<Number>(vector1); // vector1を複製<br />
trace(vector1.fixed, vector1.length);<br />
trace(vector2.fixed, vector2.length);<br />
[/as]<br />
・出力結果</p>
<pre>
true 256
true 256
</pre>
<p>trueになりました。kenさんに感謝！</p>
<p>ちなみにconcat()よりVector()で複製した方がどうやら高速のようで、<br />
データ数が256個程度だと差は出ませんが、2^20個で試してみると40msほど違いました。<br />
よって、Vectorを複製したい時はグローバル関数の Vector() を使うといいです。</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/1900/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>enhance Flex Builder</title>
		<link>http://rest-term.com/archives/1122/</link>
		<comments>http://rest-term.com/archives/1122/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 13:03:19 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=1122</guid>
		<description><![CDATA[EclipseでのFlex開発をより便利にしたい。 きっかけはThe Flash Blogのエントリーです。 New tutorial on customizing Flex Builder More Snip Tree View features! FlashTest Eclipse Plugin Alpha Pimp My Eclipse &#8211; Part 1 Pimp My Eclipse &#8211; Part 2 Pimp My Eclipse &#8211; Part 3 Eclipse起動時のスプラッシュも自分で描くというUIへの強いこだわりが感じられます。 最初は読み流してましたが、途中から記事がパート化して評判も良いようなので僕も試してみようと。 まず手始めに、TextMateに似た強力なスニペット機能をEclipseに追加します。 環境はEclipse 3.4.1(Pleiadesで日本語化済み)、Flex Builder Plugin 3.0.2。 基本的にgotoandlearn.com &#8211; Customizing Flex Builder for Flashの通りに進めていけば問題ありません。 [ヘルプ] &#62; [ソフトウェア更新] [...]]]></description>
			<content:encoded><![CDATA[<p>EclipseでのFlex開発をより便利にしたい。</p>
<p>きっかけはThe Flash Blogのエントリーです。<br />
<a href="http://theflashblog.com/?p=480">New tutorial on customizing Flex Builder</a><br />
<a href="http://theflashblog.com/?p=481">More Snip Tree View features!</a><br />
<a href="http://theflashblog.com/?p=482">FlashTest Eclipse Plugin Alpha</a><br />
<a href="http://theflashblog.com/?p=483">Pimp My Eclipse &#8211; Part 1</a><br />
<a href="http://theflashblog.com/?p=484">Pimp My Eclipse &#8211; Part 2</a><br />
<a href="http://theflashblog.com/?p=486">Pimp My Eclipse &#8211; Part 3</a></p>
<p>Eclipse起動時のスプラッシュも自分で描くというUIへの強いこだわりが感じられます。<br />
最初は読み流してましたが、途中から記事がパート化して評判も良いようなので僕も試してみようと。</p>
<p>まず手始めに、TextMateに似た強力なスニペット機能をEclipseに追加します。<br />
環境はEclipse 3.4.1(Pleiadesで日本語化済み)、Flex Builder Plugin 3.0.2。<br />
<span id="more-1122"></span><br />
基本的に<a href="http://www.gotoandlearn.com/play?id=94">gotoandlearn.com &#8211; Customizing Flex Builder for Flash</a>の通りに進めていけば問題ありません。<br />
[ヘルプ] &gt; [ソフトウェア更新] &gt; [サイトの追加] から、</p>
<p>http://www.cfeclipse.org/update</p>
<p>を追加、CFEclipseをダウンロード・インストールします。<br />
それとLeeさんが拡張プラグインを作られたようなので<a href="http://theflashblog.com/?p=486">Pimp My Eclipse &#8211; Part 3</a>からそれも併せてダウンロード。<br />
TheFlashBlog_1.0.0フォルダをEclipseのpluginsフォルダに入れてEclipseを再起動します。</p>
<p>再起動したら、[ウィンドウ] &gt; [ビューの表示] から、CFML &gt; Snip Tree Viewを選択します。</p>
<p><img class="alignnone size-medium wp-image-1128" title="sniptree" src="http://rest-term.com/wp-content/uploads/2008/12/sniptree.jpg" alt="" width="262" height="240" /></p>
<p>上のようなツリービューが出てきます。(上の画像はスニペットをいくつか追加したツリー)<br />
ここから＋ボタンを押してスニペットを作成していきます。<br />
例として以下のようなスニペットを作ります。</p>
<p><a href="http://rest-term.com/wp-content/uploads/2008/12/newsnippet.jpg"><img class="alignnone size-medium wp-image-1132" title="newsnippet" src="http://rest-term.com/wp-content/uploads/2008/12/newsnippet-300x240.jpg" alt="" width="300" height="240" /></a></p>
<p>エディタで <strong>ef</strong> (Trigger textで指定)とタイプしてShift + Spaceを押します。すると、<br />
<strong>addEventListener(Event.ENTER_FRAME, );</strong><br />
と入力されます。また、入力後のカーソル位置はSnippet starting blockの後ろになります。<br />
さらに置換機能も使うことができます。以下のように<strong> $${} </strong>構文で指定します。</p>
<p><a href="http://rest-term.com/wp-content/uploads/2008/12/embedpbj.jpg"><img class="alignnone size-medium wp-image-1144" title="embedpbj" src="http://rest-term.com/wp-content/uploads/2008/12/embedpbj-300x240.jpg" alt="" width="300" height="240" /></a></p>
<p>エディタで、<strong>pbe</strong> とタイプしてShift + Spaceを押すと以下のようなダイアログが表れます。</p>
<p><img class="alignnone size-full wp-image-1135" title="replacevariables" src="http://rest-term.com/wp-content/uploads/2008/12/replacevariables.jpg" alt="" width="436" height="168" /></p>
<p>Pleiadesが強力すぎて”Class Name”が”クラス名”に翻訳されてますね、、ここは英語のままでいいのに；<br />
URLをfilter.pbj、クラス名をmyFilterとすると、<br />
<strong>[Embed(source="filter.pbj", mimeType="application/octet-stream"])<br />
private myFilter:Class;</strong><br />
と入力されます。</p>
<p>ショートカットはデフォルトでShift+Spaceですが変更することもできます。<br />
[ウィンドウ] &gt; [設定] &gt; [一般] &gt; [キー] から&#8221;snip&#8221;で検索すると、<br />
Insert Snippet というのが見つかるのでここで変更します。</p>
<p>CFEclipseをインストールするとツールバーにたくさんアイコンが出来てしまいます。<br />
これらを消したい場合は、[パースペクティブのカスタマイズ]からCFEclipseのチェックを外せばOK。<br />
元通りすっきりしたUIになりました。<br />
<img class="alignnone size-full wp-image-1148" title="toolbar" src="http://rest-term.com/wp-content/uploads/2008/12/toolbar.jpg" alt="" width="500" height="78" /></p>
<p>コード補完に関してはEclipse Monkeyを利用してさらに便利に拡張することが可能なようです。<br />
こちらもまた試していきたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/1122/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>efficient as3 part2</title>
		<link>http://rest-term.com/archives/541/</link>
		<comments>http://rest-term.com/archives/541/#comments</comments>
		<pubDate>Sat, 08 Nov 2008 09:32:23 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=541</guid>
		<description><![CDATA[efficient as3の続きのエントリです。 Tips on how to write efficient AS3 &#8211; part 2の簡単な意訳。 Array push vs. Array index pushを使ってはいけない。値をセットする時はlist[list.length] = data;のようにしよう。配列の長さは外部変数に保存して、要素を追加/削除した時はその変数をインクリメント/デクリメント。 //コメント欄でのBlizzさんの指摘：list[list.length - 1] = data;だよね？ //返事：Blizzが正しいよ。ありがとう！ Array emptying &#8211; length 0 vs. A new Array 配列を空にするにはlengthプロパティを0にするのが、新しく配列を生成する必要もなくてかつメモリも節約できて良い方法だと考えるかもしれない。でもそれは(ほとんどのケースで)速くないよ。lengthプロパティを使って速くなるのは、一度に510個以上の配列をクリアする必要がある時だ。 Var declarations on multiple lines vs. Var declarations on a single line 数個の変数を宣言する時は、一行で書いた方が少しだけ効率的だよ。 var a:int=0, b:int=0, c:int=0; vs. var [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rest-term.com/archives/222">efficient as3</a>の続きのエントリです。</p>
<p><a href="http://www.lostinactionscript.com/blog/index.php/2008/11/01/tips-on-how-to-write-efficient-as3-part-2/">Tips on how to write efficient AS3 &#8211; part 2</a>の簡単な意訳。</p>
<p><strong>Array push vs. Array index</strong><br />
pushを使ってはいけない。値をセットする時はlist[list.length] = data;のようにしよう。配列の長さは外部変数に保存して、要素を追加/削除した時はその変数をインクリメント/デクリメント。</p>
<p><span style="text-decoration:line-through;">//コメント欄でのBlizzさんの指摘：list[list.length - 1] = data;だよね？</span><br />
<span style="text-decoration:line-through;">//返事：Blizzが正しいよ。ありがとう！</span></p>
<p><strong>Array emptying &#8211; length 0 vs. A new Array</strong><br />
配列を空にするにはlengthプロパティを0にするのが、新しく配列を生成する必要もなくてかつメモリも節約できて良い方法だと考えるかもしれない。でもそれは(ほとんどのケースで)速くないよ。lengthプロパティを使って速くなるのは、一度に510個以上の配列をクリアする必要がある時だ。</p>
<p><strong>Var declarations on multiple lines vs. Var declarations on a single line</strong><br />
数個の変数を宣言する時は、一行で書いた方が少しだけ効率的だよ。</p>
<pre>
var a:int=0, b:int=0, c:int=0;
vs.
var a:int=0;
var b:int=0;
var c:int=0;
</pre>
<p><strong>※</strong>この項目については、コメント欄や外部リンクにてバイトコードやメモリ使用量にまで話が及んだ熱いやり取りが行われていました。追いかけて読んでみると楽しいです。</p>
<p><strong>Using Xor to swap variables</strong><br />
値を交換する時に3つ目の変数を作りたくない時は、</p>
<pre>
a = a^b;
b = a^b;
a = a^b;
</pre>
<p>のようにすると、</p>
<pre>
var oldB:int = b;
b = a;
a = oldB;
</pre>
<p>よりも300%ほど速くなるよ。</p>
<p><strong>Multiplication vs. Division</strong><br />
割り算より掛け算の方が約130%速いよ。5000/1000 より 5000*0.001。</p>
<p><strong>Type casting comparison</strong><br />
型をキャストする時はasを使った方がType(item)よりも250%速いよ。でもどちらも使わなければ1400%ほど速くてビビった。</p>
<p><strong>Long vs Short variable names</strong><br />
この項目は論争の余地がある。なぜならこれを実践すると可読性の低いコードになるからね。短い変数は1つのループ内で1000回反復して1ミリ秒速くなる程度。でも僕はこれがコード最適化の最後の切り札だと考えてるよ。</p>
<p><strong>※</strong>この元の記事ではコメント欄も併せて読むといいと思います。</p>
<p>ちなみに最初の項目は僕も試してみました。<br />
ヒルベルト曲線のクラスでは、drawPath()を使うためにVectorにひたすら値をpushしてましたが、</p>
<pre>
data.push(pt.x + dx);
data.push(pt.y + dy);
       ↓↓↓
data[iter++] = pt.x + dx;
data[iter++] = pt.y + dy;
</pre>
<p>のように変更して10次のヒルベルト曲線を書いてみると、</p>
<p>・data.push()：2142ms<br />
・data[iter++]：1837ms</p>
<p>となり少し高速化しました。(関連：<a href="http://rest-term.com/archives/479">Hilbert Curve &#8211; Flex(AS3.0)</a>)<br />
とりあえず参考までに。</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/541/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ObjectUtil.getClassInfo &#8211; Flex</title>
		<link>http://rest-term.com/archives/508/</link>
		<comments>http://rest-term.com/archives/508/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 10:55:25 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=508</guid>
		<description><![CDATA[ActionScriptでクラスの情報を得るには、flash.utils.describeTypeメソッドを使いますが、Flexの場合だと、mx.utils.ObjectUtilのgetClassInfoメソッドでも簡易情報を取得できます。 前回のヒルベルト曲線のクラスをdescribeTypeとObjectUtil.getClassInfoの2つのメソッドでクラス情報を取得してみると、 ・describeType() &#60;type name=&#34;Hilbert&#34; base=&#34;flash.display::Shape&#34; isDynamic=&#34;false&#34; isFinal=&#34;false&#34; isStatic=&#34;false&#34;&#62; &#60;extendsClass type=&#34;flash.display::Shape&#34;/&#62; &#60;extendsClass type=&#34;flash.display::DisplayObject&#34;/&#62; &#60;extendsClass type=&#34;flash.events::EventDispatcher&#34;/&#62; &#60;extendsClass type=&#34;Object&#34;/&#62; &#60;implementsInterface type=&#34;flash.display::IBitmapDrawable&#34;/&#62; &#60;implementsInterface type=&#34;flash.events::IEventDispatcher&#34;/&#62; &#60;constructor&#62; &#60;parameter index=&#34;1&#34; type=&#34;int&#34; optional=&#34;false&#34;/&#62; &#60;parameter index=&#34;2&#34; type=&#34;uint&#34; optional=&#34;false&#34;/&#62; &#60;/constructor&#62; &#60;variable name=&#34;data&#34; type=&#34;__AS3__.vec::Vector.&#38;lt;Number&#62;&#34;/&#62; &#60;accessor name=&#34;graphics&#34; access=&#34;readonly&#34; type=&#34;flash.display::Graphics&#34; declaredBy=&#34;flash.display::Shape&#34;/&#62; &#60;accessor name=&#34;scaleZ&#34; access=&#34;readwrite&#34; type=&#34;Number&#34; declaredBy=&#34;flash.display::DisplayObject&#34;/&#62; &#60;accessor name=&#34;accessibilityProperties&#34; access=&#34;readwrite&#34; type=&#34;flash.accessibility::AccessibilityProperties&#34; declaredBy=&#34;flash.display::DisplayObject&#34;/&#62; &#60;accessor name=&#34;scrollRect&#34; access=&#34;readwrite&#34; type=&#34;flash.geom::Rectangle&#34; declaredBy=&#34;flash.display::DisplayObject&#34;/&#62; &#60;accessor [...]]]></description>
			<content:encoded><![CDATA[<p>ActionScriptでクラスの情報を得るには、<strong>flash.utils.describeType</strong>メソッドを使いますが、Flexの場合だと、<strong>mx.utils.ObjectUtil</strong>の<strong><a href="http://www.adobe.us/livedocs/flex/3_jp/langref/mx/utils/ObjectUtil.html#getClassInfo()">getClassInfo</a></strong>メソッドでも簡易情報を取得できます。</p>
<p>前回のヒルベルト曲線のクラスをdescribeTypeとObjectUtil.getClassInfoの2つのメソッドでクラス情報を取得してみると、</p>
<p>・<strong>describeType()</strong></p>
<pre style="height:250px;">
&lt;type name=&quot;Hilbert&quot; base=&quot;flash.display::Shape&quot; isDynamic=&quot;false&quot; isFinal=&quot;false&quot; isStatic=&quot;false&quot;&gt;
  &lt;extendsClass type=&quot;flash.display::Shape&quot;/&gt;
  &lt;extendsClass type=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;extendsClass type=&quot;flash.events::EventDispatcher&quot;/&gt;
  &lt;extendsClass type=&quot;Object&quot;/&gt;
  &lt;implementsInterface type=&quot;flash.display::IBitmapDrawable&quot;/&gt;
  &lt;implementsInterface type=&quot;flash.events::IEventDispatcher&quot;/&gt;
  &lt;constructor&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;int&quot; optional=&quot;false&quot;/&gt;
    &lt;parameter index=&quot;2&quot; type=&quot;uint&quot; optional=&quot;false&quot;/&gt;
  &lt;/constructor&gt;
  &lt;variable name=&quot;data&quot; type=&quot;__AS3__.vec::Vector.&amp;lt;Number&gt;&quot;/&gt;
  &lt;accessor name=&quot;graphics&quot; access=&quot;readonly&quot; type=&quot;flash.display::Graphics&quot; declaredBy=&quot;flash.display::Shape&quot;/&gt;
  &lt;accessor name=&quot;scaleZ&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;accessibilityProperties&quot; access=&quot;readwrite&quot; type=&quot;flash.accessibility::AccessibilityProperties&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;scrollRect&quot; access=&quot;readwrite&quot; type=&quot;flash.geom::Rectangle&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;rotationZ&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;height&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;method name=&quot;getBounds&quot; declaredBy=&quot;flash.display::DisplayObject&quot; returnType=&quot;flash.geom::Rectangle&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;flash.display::DisplayObject&quot; optional=&quot;false&quot;/&gt;
  &lt;/method&gt;
  &lt;accessor name=&quot;blendShader&quot; access=&quot;writeonly&quot; type=&quot;flash.display::Shader&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;opaqueBackground&quot; access=&quot;readwrite&quot; type=&quot;Object&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;alpha&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;cacheAsBitmap&quot; access=&quot;readwrite&quot; type=&quot;Boolean&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;method name=&quot;local3DToGlobal&quot; declaredBy=&quot;flash.display::DisplayObject&quot; returnType=&quot;flash.geom::Point&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;flash.geom::Vector3D&quot; optional=&quot;false&quot;/&gt;
  &lt;/method&gt;
  &lt;accessor name=&quot;x&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;visible&quot; access=&quot;readwrite&quot; type=&quot;Boolean&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;y&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;scaleX&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;method name=&quot;globalToLocal3D&quot; declaredBy=&quot;flash.display::DisplayObject&quot; returnType=&quot;flash.geom::Vector3D&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;flash.geom::Point&quot; optional=&quot;false&quot;/&gt;
  &lt;/method&gt;
  &lt;accessor name=&quot;mouseX&quot; access=&quot;readonly&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;method name=&quot;hitTestPoint&quot; declaredBy=&quot;flash.display::DisplayObject&quot; returnType=&quot;Boolean&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;Number&quot; optional=&quot;false&quot;/&gt;
    &lt;parameter index=&quot;2&quot; type=&quot;Number&quot; optional=&quot;false&quot;/&gt;
    &lt;parameter index=&quot;3&quot; type=&quot;Boolean&quot; optional=&quot;true&quot;/&gt;
  &lt;/method&gt;
  &lt;accessor name=&quot;scaleY&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;z&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;mouseY&quot; access=&quot;readonly&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;parent&quot; access=&quot;readonly&quot; type=&quot;flash.display::DisplayObjectContainer&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;mask&quot; access=&quot;readwrite&quot; type=&quot;flash.display::DisplayObject&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;method name=&quot;getRect&quot; declaredBy=&quot;flash.display::DisplayObject&quot; returnType=&quot;flash.geom::Rectangle&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;flash.display::DisplayObject&quot; optional=&quot;false&quot;/&gt;
  &lt;/method&gt;
  &lt;accessor name=&quot;rotation&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;width&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;method name=&quot;localToGlobal&quot; declaredBy=&quot;flash.display::DisplayObject&quot; returnType=&quot;flash.geom::Point&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;flash.geom::Point&quot; optional=&quot;false&quot;/&gt;
  &lt;/method&gt;
  &lt;method name=&quot;globalToLocal&quot; declaredBy=&quot;flash.display::DisplayObject&quot; returnType=&quot;flash.geom::Point&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;flash.geom::Point&quot; optional=&quot;false&quot;/&gt;
  &lt;/method&gt;
  &lt;accessor name=&quot;transform&quot; access=&quot;readwrite&quot; type=&quot;flash.geom::Transform&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;blendMode&quot; access=&quot;readwrite&quot; type=&quot;String&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;root&quot; access=&quot;readonly&quot; type=&quot;flash.display::DisplayObject&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;name&quot; access=&quot;readwrite&quot; type=&quot;String&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;loaderInfo&quot; access=&quot;readonly&quot; type=&quot;flash.display::LoaderInfo&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;scale9Grid&quot; access=&quot;readwrite&quot; type=&quot;flash.geom::Rectangle&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;filters&quot; access=&quot;readwrite&quot; type=&quot;Array&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;rotationX&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;method name=&quot;hitTestObject&quot; declaredBy=&quot;flash.display::DisplayObject&quot; returnType=&quot;Boolean&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;flash.display::DisplayObject&quot; optional=&quot;false&quot;/&gt;
  &lt;/method&gt;
  &lt;accessor name=&quot;stage&quot; access=&quot;readonly&quot; type=&quot;flash.display::Stage&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;accessor name=&quot;rotationY&quot; access=&quot;readwrite&quot; type=&quot;Number&quot; declaredBy=&quot;flash.display::DisplayObject&quot;/&gt;
  &lt;method name=&quot;toString&quot; declaredBy=&quot;flash.events::EventDispatcher&quot; returnType=&quot;String&quot;/&gt;
  &lt;method name=&quot;addEventListener&quot; declaredBy=&quot;flash.events::EventDispatcher&quot; returnType=&quot;void&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;String&quot; optional=&quot;false&quot;/&gt;
    &lt;parameter index=&quot;2&quot; type=&quot;Function&quot; optional=&quot;false&quot;/&gt;
    &lt;parameter index=&quot;3&quot; type=&quot;Boolean&quot; optional=&quot;true&quot;/&gt;
    &lt;parameter index=&quot;4&quot; type=&quot;int&quot; optional=&quot;true&quot;/&gt;
    &lt;parameter index=&quot;5&quot; type=&quot;Boolean&quot; optional=&quot;true&quot;/&gt;
  &lt;/method&gt;
  &lt;method name=&quot;hasEventListener&quot; declaredBy=&quot;flash.events::EventDispatcher&quot; returnType=&quot;Boolean&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;String&quot; optional=&quot;false&quot;/&gt;
  &lt;/method&gt;
  &lt;method name=&quot;dispatchEvent&quot; declaredBy=&quot;flash.events::EventDispatcher&quot; returnType=&quot;Boolean&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;flash.events::Event&quot; optional=&quot;false&quot;/&gt;
  &lt;/method&gt;
  &lt;method name=&quot;removeEventListener&quot; declaredBy=&quot;flash.events::EventDispatcher&quot; returnType=&quot;void&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;String&quot; optional=&quot;false&quot;/&gt;
    &lt;parameter index=&quot;2&quot; type=&quot;Function&quot; optional=&quot;false&quot;/&gt;
    &lt;parameter index=&quot;3&quot; type=&quot;Boolean&quot; optional=&quot;true&quot;/&gt;
  &lt;/method&gt;
  &lt;method name=&quot;willTrigger&quot; declaredBy=&quot;flash.events::EventDispatcher&quot; returnType=&quot;Boolean&quot;&gt;
    &lt;parameter index=&quot;1&quot; type=&quot;String&quot; optional=&quot;false&quot;/&gt;
  &lt;/method&gt;
&lt;/type&gt;
</pre>
<p>・<strong>ObjectUtil.getClassInfo()</strong></p>
<pre style="height:250px;">
(Object)#0
  alias = &quot;&quot;
  dynamic = false
  metadata = (null)
  name = &quot;Hilbert&quot;
  properties = (Array)#1
    [0] (QName)#2
      localName = &quot;accessibilityProperties&quot;
      uri = &quot;&quot;
    [1] (QName)#3
      localName = &quot;alpha&quot;
      uri = &quot;&quot;
    [2] (QName)#4
      localName = &quot;blendMode&quot;
      uri = &quot;&quot;
    [3] (QName)#5
      localName = &quot;cacheAsBitmap&quot;
      uri = &quot;&quot;
    [4] (QName)#6
      localName = &quot;filters&quot;
      uri = &quot;&quot;
    [5] (QName)#7
      localName = &quot;graphics&quot;
      uri = &quot;&quot;
    [6] (QName)#8
      localName = &quot;height&quot;
      uri = &quot;&quot;
    [7] (QName)#9
      localName = &quot;loaderInfo&quot;
      uri = &quot;&quot;
    [8] (QName)#10
      localName = &quot;mask&quot;
      uri = &quot;&quot;
    [9] (QName)#11
      localName = &quot;mouseX&quot;
      uri = &quot;&quot;
    [10] (QName)#12
      localName = &quot;mouseY&quot;
      uri = &quot;&quot;
    [11] (QName)#13
      localName = &quot;name&quot;
      uri = &quot;&quot;
    [12] (QName)#14
      localName = &quot;opaqueBackground&quot;
      uri = &quot;&quot;
    [13] (QName)#15
      localName = &quot;parent&quot;
      uri = &quot;&quot;
    [14] (QName)#16
      localName = &quot;root&quot;
      uri = &quot;&quot;
    [15] (QName)#17
      localName = &quot;rotation&quot;
      uri = &quot;&quot;
    [16] (QName)#18
      localName = &quot;rotationX&quot;
      uri = &quot;&quot;
    [17] (QName)#19
      localName = &quot;rotationY&quot;
      uri = &quot;&quot;
    [18] (QName)#20
      localName = &quot;rotationZ&quot;
      uri = &quot;&quot;
    [19] (QName)#21
      localName = &quot;scale9Grid&quot;
      uri = &quot;&quot;
    [20] (QName)#22
      localName = &quot;scaleX&quot;
      uri = &quot;&quot;
    [21] (QName)#23
      localName = &quot;scaleY&quot;
      uri = &quot;&quot;
    [22] (QName)#24
      localName = &quot;scaleZ&quot;
      uri = &quot;&quot;
    [23] (QName)#25
      localName = &quot;scrollRect&quot;
      uri = &quot;&quot;
    [24] (QName)#26
      localName = &quot;stage&quot;
      uri = &quot;&quot;
    [25] (QName)#27
      localName = &quot;transform&quot;
      uri = &quot;&quot;
    [26] (QName)#28
      localName = &quot;visible&quot;
      uri = &quot;&quot;
    [27] (QName)#29
      localName = &quot;width&quot;
      uri = &quot;&quot;
    [28] (QName)#30
      localName = &quot;x&quot;
      uri = &quot;&quot;
    [29] (QName)#31
      localName = &quot;y&quot;
      uri = &quot;&quot;
    [30] (QName)#32
      localName = &quot;z&quot;
      uri = &quot;&quot;
</pre>
<p>どうやらgetClassInfo()ではパブリックプロパティのQNameが返ってくるようです。<br />
AS3.0の場合だとE4Xがあるので、describeType()の方がまだ使えますね。<br />
getClassInfo()の方はどういうときに便利に利用できるのか思いつきません。。</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/508/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Binding &#8211; Flex</title>
		<link>http://rest-term.com/archives/196/</link>
		<comments>http://rest-term.com/archives/196/#comments</comments>
		<pubDate>Sat, 27 Sep 2008 19:25:37 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=196</guid>
		<description><![CDATA[Flexのバインディングで試したこと。記事にするほどのことじゃないんですけど。 TextInputの内容を相互にバインディングしたら無限ループする、、わけないよなぁと思って書いてみたらやっぱりしませんでしたという話。 &#60;mx:TextInput id=&#34;TextInputA&#34; text=&#34;{TextInputB.text}&#34;/&#62; &#60;mx:TextInput id=&#34;TextInputB&#34; text=&#34;{TextInputA.text}&#34;/&#62; 2つのテキストインプットそれぞれに文字を入れてみてください↓ ソースが変更されたときに1回だけトリガされるんですね。 こんな所で開発者が無限ループの心配する必要はなく、そこはFlexがちゃんとやってくれると。 親切。]]></description>
			<content:encoded><![CDATA[<p>Flexのバインディングで試したこと。記事にするほどのことじゃないんですけど。</p>
<p>TextInputの内容を相互にバインディングしたら無限ループする、、わけないよなぁと思って書いてみたらやっぱりしませんでしたという話。</p>
<pre>
&lt;mx:TextInput id=&quot;TextInputA&quot; text=&quot;{TextInputB.text}&quot;/&gt;
&lt;mx:TextInput id=&quot;TextInputB&quot; text=&quot;{TextInputA.text}&quot;/&gt;
</pre>
<p>2つのテキストインプットそれぞれに文字を入れてみてください↓<br />
<object data="http://rest-term.com/contents/flex/misc/bindtest.swf" type="application/x-shockwave-flash" height="130" width="300"><param name="movie" value="bindtest.swf"></param></object></p>
<p>ソースが変更されたときに1回だけトリガされるんですね。<br />
こんな所で開発者が無限ループの心配する必要はなく、そこはFlexがちゃんとやってくれると。<br />
親切。</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/196/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SWFの複製 &#8211; Flex</title>
		<link>http://rest-term.com/archives/120/</link>
		<comments>http://rest-term.com/archives/120/#comments</comments>
		<pubDate>Sat, 06 Sep 2008 08:15:24 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=120</guid>
		<description><![CDATA[Loaderクラスを使って外部SWFをロードするサンプルはたくさんありますが、今回はLoaderとByteArrayを利用してStageにロード済みのSWFを複製します。 ここで肝になるのはLoaderInfoクラスです。 LoaderInfo クラスは、ロードされる SWF ファイルやイメージファイル (JPEG、GIF、PNG ファイルなど) に関する情報を提供します。LoaderInfo オブジェクトは、すべての表示オブジェクトで使用できます。提供される情報には、ロードの進行状況、ロードする側とロードされたコンテンツの URL、メディアの総バイト数、メディアの規格高さと幅などが含まれます。 複製の手順は以下の通りです。 1. DisplayObject(SWFやロードされたImage)のloaderInfoプロパティからバイト情報を取得(ByteArrayに格納) 2. Loader.loadBytes()でそのバイト情報を読み込む 3. LoaderオブジェクトのcontentLoaderInfoプロパティにアクセスしてロード状況を監視 4. ロードが完了したらLoaderをaddChild バイト情報を取得するには、loaderInfo.bytesで取得できます。 ただし、FlashPlayerのバージョンが9.0.115.0からじゃないと使えないので注意！ Flex2のリファレンスには載ってませんでした。なのでFlex3.0以降で。 下の図にもあるように、LoaderInfoオブジェクトは、ロードされたオブジェクトファイルとロードした Loader オブジェクト間で共有されているようです。 ロードされたSWFの複製をFlexで行う場合の例を以下に示します。 Imageコンポーネント(Img)にロードされたSWFを別のImageコンポーネント内(DupImg)に複製 &#60;mx:Image id=&#34;Img&#34; width=&#34;200&#34; height=&#34;200&#34; source=&#34;starjulia.swf&#34; /&#62; &#60;mx:Image id=&#34;DupImg&#34; width=&#34;200&#34; height=&#34;200&#34; /&#62; &#60;mx:ApplicationControlBar width=&#34;100%&#34;&#62; &#60;mx:Button label=&#34;Duplicate&#34; click=&#34;{this.duplicateImg()}&#34; /&#62; &#60;mx:Button label=&#34;Delete Duplicate&#34; click=&#34;{DupImg.source = null}&#34; /&#62; &#60;/mx:ApplicationControlBar&#62; &#60;mx:Script&#62;&#60;![CDATA[ private [...]]]></description>
			<content:encoded><![CDATA[<p>Loaderクラスを使って外部SWFをロードするサンプルはたくさんありますが、今回はLoaderとByteArrayを利用してStageにロード済みのSWFを複製します。</p>
<p>ここで肝になるのは<strong><a href="http://livedocs.adobe.com/flex/3_jp/langref/flash/display/LoaderInfo.html">LoaderInfo</a></strong>クラスです。</p>
<blockquote><p>LoaderInfo クラスは、ロードされる SWF ファイルやイメージファイル (JPEG、GIF、PNG ファイルなど) に関する情報を提供します。LoaderInfo オブジェクトは、すべての表示オブジェクトで使用できます。提供される情報には、ロードの進行状況、ロードする側とロードされたコンテンツの URL、メディアの総バイト数、メディアの規格高さと幅などが含まれます。</p></blockquote>
<p>複製の手順は以下の通りです。<br />
1. DisplayObject(SWFやロードされたImage)の<strong>loaderInfo</strong>プロパティからバイト情報を取得(ByteArrayに格納)<br />
2. Loader.loadBytes()でそのバイト情報を読み込む<br />
3. Loaderオブジェクトの<strong>contentLoaderInfo</strong>プロパティにアクセスしてロード状況を監視<br />
4. ロードが完了したらLoaderをaddChild</p>
<p>バイト情報を取得するには、<strong>loaderInfo.bytes</strong>で取得できます。<br />
ただし、FlashPlayerのバージョンが<strong>9.0.115.0</strong>からじゃないと使えないので注意！<br />
Flex2のリファレンスには載ってませんでした。なのでFlex3.0以降で。</p>
<p>下の図にもあるように、LoaderInfoオブジェクトは、ロードされたオブジェクトファイルとロードした Loader オブジェクト間で共有されているようです。<br />
<img src="http://rest-term.com/wp-content/uploads/2008/09/loaderinfo_object1.jpg" alt="" title="loaderinfo_object1" width="407" height="318" class="alignnone size-full wp-image-122" /></p>
<p>ロードされたSWFの複製をFlexで行う場合の例を以下に示します。</p>
<pre>
<strong>Imageコンポーネント(Img)にロードされたSWFを別のImageコンポーネント内(DupImg)に複製</strong>

&lt;mx:Image id=&quot;Img&quot; width=&quot;200&quot; height=&quot;200&quot; source=&quot;starjulia.swf&quot; /&gt;
&lt;mx:Image id=&quot;DupImg&quot; width=&quot;200&quot; height=&quot;200&quot; /&gt;

&lt;mx:ApplicationControlBar width=&quot;100%&quot;&gt;
  &lt;mx:Button label=&quot;Duplicate&quot; click=&quot;{this.duplicateImg()}&quot; /&gt;
  &lt;mx:Button label=&quot;Delete Duplicate&quot; click=&quot;{DupImg.source = null}&quot; /&gt;
&lt;/mx:ApplicationControlBar&gt;

&lt;mx:Script&gt;&lt;![CDATA[

private var loader:Loader;

private function duplicateImg():void{
  var ba:ByteArray = Img.content.loaderInfo.bytes
  loader = new Loader();
  loader.loadBytes(ba);
  loader.contentLoaderInfo.addEventListener(Event.COMPLETE, bytesLoaded);
}

private function bytesLoaded(event:Event):void{
  DupImg.source = loader;
}

]]&gt;&lt;/mx:Script&gt;
</pre>
<p><object data="http://rest-term.com/contents/flex/misc/duplicate.swf" type="application/x-shockwave-flash" height="320" width="500"><param name="movie" value="duplicate.swf"></param></object></p>
<p>(Flashが表示されない場合はこちら→<a href="http://rest-term.com/contents/flex/misc/duplicate.swf">duplicate.swf</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/120/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ArrayUtil (as3corelib)</title>
		<link>http://rest-term.com/archives/119/</link>
		<comments>http://rest-term.com/archives/119/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 10:28:36 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=119</guid>
		<description><![CDATA[as3corelibのArrayUtilクラスの使い方。 メソッドは5つしかなく使い方も簡単なので紹介程度に。 1つめ。配列(arr)内にある値(value)が含まれているかを調べるメソッド。 public static arrayContainsValue(arr:Array,value:Object):Boolean 2つめ。2つの配列(arr1とarr2)が等しいか調べるメソッド。 public static function arraysAreEqual(arr1:Array, arr2:Array):Boolean 3つめ。配列をコピーするメソッド。 public static function copyArray(arr:Array):Array 例） private var arr:Array = [1,2,3,4,5]; private var copyArr:Array = []; copyArr = ArrayUtil.copyArray(arr); trace(copyArr); //出力結果 1,2,3,4,5 4つめ。要素の重複を許さずに配列をコピーするメソッド。 public static function createUniqueCopy(a:Array):Array 例） private var arr:Array = [1,1,2,2,3,4,5]; private var uniqueCopyArr:Array = []; uniqueCopyArr = ArrayUtil.createUniqueCopy(arr); trace(uniqueCopyArr); //出力結果 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/as3corelib/">as3corelib</a>の<a href="http://as3corelib.googlecode.com/svn/trunk/docs/com/adobe/utils/ArrayUtil.html">ArrayUtil</a>クラスの使い方。<br />
メソッドは5つしかなく使い方も簡単なので紹介程度に。</p>
<p>1つめ。配列(arr)内にある値(value)が含まれているかを調べるメソッド。</p>
<pre style="height:30px;">public static arrayContainsValue(arr:Array,value:Object):Boolean</pre>
<p>2つめ。2つの配列(arr1とarr2)が等しいか調べるメソッド。</p>
<pre style="height:30px;">public static function arraysAreEqual(arr1:Array, arr2:Array):Boolean</pre>
<p>3つめ。配列をコピーするメソッド。</p>
<pre style="height:30px;">public static function copyArray(arr:Array):Array</pre>
<p>例）</p>
<pre>
private var arr:Array = [1,2,3,4,5];
private var copyArr:Array = [];
copyArr = ArrayUtil.copyArray(arr);
trace(copyArr);

//出力結果
1,2,3,4,5
</pre>
<p>4つめ。要素の重複を許さずに配列をコピーするメソッド。</p>
<pre style="height:30px;">public static function createUniqueCopy(a:Array):Array</pre>
<p>例）</p>
<pre>
private var arr:Array = [1,1,2,2,3,4,5];
private var uniqueCopyArr:Array = [];
uniqueCopyArr = ArrayUtil.createUniqueCopy(arr);
trace(uniqueCopyArr);

//出力結果
1,2,3,4,5
</pre>
<p>5つめ。配列(arr)から要素(value)を削除するメソッド。</p>
<pre style="height:30px;">public static function removeValueFromArray(arr:Array, value:Object):void</pre>
<p>この５つだけです。<br />
ArrayUtilのソースを見てもらえればわかりますが、実際に行っている処理はとても簡単で、<br />
arrayContainsValueとcopyArrayに至っては中身はたった１行です。<br />
copyArrayはslice()を使っているようだけど、concat()に変えると少し速くなりそう。<br />
corelibを使わなくても自分でこれ相当のクラスを作っている人もたくさんいるでしょうね。</p>
<p><a href="http://as3corelib.googlecode.com/svn/trunk/docs/com/adobe/utils/package-detail.html">com.adobe.utils.</a>にはArrayUtilの他にも7つのクラスがあります。<br />
DateUtilクラスは結構大きなクラスなので読むのがちょっと大変；<br />
DateUtil、StringUtil、XMLUtilなどは便利そうなので機会があればまた紹介したいと思います。　</p>
<p>関連記事<br />
<a href="http://rest-term.com/archives/103">配列コピー &#8211; ActionScript</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/119/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>fl.* Package.swc</title>
		<link>http://rest-term.com/archives/117/</link>
		<comments>http://rest-term.com/archives/117/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 17:07:08 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=117</guid>
		<description><![CDATA[Flash CS3は持ってないけど、Flexでもfl.motionなどのflパッケージを使いたい時がたまにあります。 以下のサイトでfl.swcが配布されています。 Downloads &#124; EVOLVE 以前、別のサイトでもswcで配布されてたんですけど、そのサイトが閉鎖されてて困っていました； Flexで使うには、flex_sdk/frameworks/libsにfl.swcを置くだけでOK。 どうやらちゃんと使えるようです。]]></description>
			<content:encoded><![CDATA[<p>Flash CS3は持ってないけど、Flexでもfl.motionなどのflパッケージを使いたい時がたまにあります。<br />
以下のサイトでfl.swcが配布されています。<br />
<a href="http://evolve.reintroducing.com/downloads/">Downloads | EVOLVE</a></p>
<p>以前、別のサイトでもswcで配布されてたんですけど、そのサイトが閉鎖されてて困っていました；</p>
<p>Flexで使うには、flex_sdk/frameworks/libsにfl.swcを置くだけでOK。</p>
<p><img src="http://rest-term.com/wp-content/uploads/2008/09/fl_package.jpg" alt="" title="fl_package" width="466" height="344" class="alignnone size-full wp-image-118" /></p>
<p>どうやらちゃんと使えるようです。</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/117/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>二十四節気</title>
		<link>http://rest-term.com/archives/107/</link>
		<comments>http://rest-term.com/archives/107/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 14:40:13 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=107</guid>
		<description><![CDATA[カレンダーを作る際、閏(うるう)年の判定プログラムはよく話題に挙げられます。 年が100の倍数のときは400で割れる年、100の倍数でないときは4で割り切れる年ってやつですね。 今回はもう少しややこしい二十四節気(にじゅうしせっき)の判定プログラムです。 祝日の春分・秋分を含む二十四節気は、日付が固定されてるわけではなく計算式で求められます。 二十四節気 &#8211; Wikipediaによると、 「1太陽年を日数（平気法）あるいは太陽の黄道上の視位置（定気法）によって24等分し、その分割点を含む日に季節を表す名称を付したもの」 とあります。 360度を24で割ると15度。 視太陽黄経が15度の倍数になる瞬間、日常的にはそれを含む「日」を二十四節気とします。 計算式は以下のサイトで説明されています。 二十四節気の略算式 [日] ＝ ＩＮＴ(Ｄ ＋ (Ａ × (Ｙ &#8211; １９００)) &#8211; ＩＮＴ((Ｙ &#8211; １９００) ÷ ４)) この二十四節気を求めるプログラム例として、 1月の小寒から12月の冬至までの各パラメータ(dおよびa)の配列(結合配列の配列)を用意します。 (ここではActionScriptで書いています) private const param:Array = [ { d:6.3811, a:0.242778 }, { d:21.1046, a:0.242765 }, { d:4.8693, a:0.242713 }, { d:19.7062, a:0.242627 }, { d:6.3968, a:0.242512 [...]]]></description>
			<content:encoded><![CDATA[<p>カレンダーを作る際、閏(うるう)年の判定プログラムはよく話題に挙げられます。<br />
年が100の倍数のときは400で割れる年、100の倍数でないときは4で割り切れる年ってやつですね。</p>
<p>今回はもう少しややこしい<strong>二十四節気</strong>(にじゅうしせっき)の判定プログラムです。<br />
祝日の春分・秋分を含む二十四節気は、日付が固定されてるわけではなく計算式で求められます。<br />
<a href="http://ja.wikipedia.org/wiki/%E4%BA%8C%E5%8D%81%E5%9B%9B%E7%AF%80%E6%B0%97">二十四節気 &#8211; Wikipedia</a>によると、<br />
「1太陽年を日数（平気法）あるいは太陽の黄道上の視位置（定気法）によって24等分し、その分割点を含む日に季節を表す名称を付したもの」<br />
とあります。<br />
360度を24で割ると15度。<br />
視太陽黄経が15度の倍数になる瞬間、日常的にはそれを含む「日」を二十四節気とします。<br />
計算式は以下のサイトで説明されています。<br />
<a href="http://www.h3.dion.ne.jp/~sakatsu/sekki24_topic.htm">二十四節気の略算式</a><br />
<strong>[日] ＝ ＩＮＴ(Ｄ ＋ (Ａ × (Ｙ &#8211; １９００)) &#8211; ＩＮＴ((Ｙ &#8211; １９００) ÷ ４))</strong></p>
<p>この二十四節気を求めるプログラム例として、<br />
1月の小寒から12月の冬至までの各パラメータ(dおよびa)の配列(結合配列の配列)を用意します。<br />
(ここではActionScriptで書いています)</p>
<pre><code>
private const param:Array = [ { d:6.3811, a:0.242778 }, { d:21.1046, a:0.242765 }, { d:4.8693, a:0.242713 }, { d:19.7062, a:0.242627 }, { d:6.3968, a:0.242512 }, { d:21.4471, a:0.242377 }, { d:5.6280, a:0.242231 }, { d:20.9375, a:0.242083 }, { d:6.3771, a:0.241945 }, { d:21.9300, a:0.241825 }, { d:6.5733, a:0.241731 }, { d:22.2747, a:0.241669 }, { d:8.0091, a:0.241642 }, { d:23.7317, a:0.241654 }, { d:8.4102, a:0.241703 }, { d:24.0125, a:0.241786 }, { d:8.5186, a:0.241898 }, { d:23.8896, a:0.242032 }, { d:9.1414, a:0.242179 }, { d:24.2487, a:0.242328 }, { d:8.2396, a:0.242469 }, { d:23.1189, a:0.242592 }, { d:7.9152, a:0.242689 }, { d:22.6587, a:0.242752 } ];
</code></pre>
<p>あとは以下のような日付を計算する関数を作り、各引数を変えて使うだけです。</p>
<pre><code>
private function calculateDate(y:int, d:Number, a:Number):int {
  return d + a * (y - 1900) - Math.floor((y - 1900) / 4);    //yは年(西暦)
}
</code></pre>
<p>ここで気を付けることは、小寒から雨水までの4つは年(y)から1引いておくことです。<br />
(2008年ならyには2007を使用する)</p>
<pre><code>
/* day(Array)に小寒から冬至までの日付を格納, yearは任意の年 */

var day:Array = [];
var len:int = param.length;
var year:int = int(YearInput.text);    //YearInputはmx:TextInput
for (var i:int = 0; i < len; i++) {
  if (i < 4) day.push(calculateDate(year-1, param[i].d, param[i].a));
  else day.push(calculateDate(year, param[i].d, param[i].a));
}
</code></pre>
<p>これらを使ってFlexのDataGridに二十四節気を表示させました。<br />
(Flashが表示されてない人はこちらから→<a href="http://rest-term.com/contents/flex/misc/season.swf">season.swf</a>)<br />
フォームに年を西暦で入力してください。(1870～2099年まで, 精度は0.03日程度)<br />
また、DataGridの各行をクリックすると各節気の暦便覧も見れます。</p>
<p><object data="http://rest-term.com/contents/flex/misc/season.swf" type="application/x-shockwave-flash" height="460" width="450"><param name="movie" value="season.swf"></param></object></p>
<p>これ以外にも、土用や節分などの<strong>雑節</strong>もあります。<br />
さらに<strong>六曜</strong>や<strong>干支</strong>なども考慮すると、まともな暦を作るのは結構たいへんそうですね;;</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/107/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配列コピー &#8211; ActionScript</title>
		<link>http://rest-term.com/archives/103/</link>
		<comments>http://rest-term.com/archives/103/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 10:52:36 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=103</guid>
		<description><![CDATA[ActionScriptで配列とかディープコピーするのはどんな方法が一般的なんだろうと思って調べてました。 今回は、僕のようなAS初級者向けの内容です。 以下のエントリーでByteArrayを使ってオブジェクトをディープコピーする例がありました。 ActionScriptでディープコピー おぉ、けっこう簡単。後追いですが僕も検証してみました。 var list:Array = [0,1,2,3]; var ba:ByteArray = new ByteArray(); ba.writeObject(list); ba.position = 0; var copy:Array = ba.readObject(); trace(copy); copy[2] = 4; trace(copy); trace(list); //出力結果 0,1,2,3 0,1,4,3 0,1,2,3 うん、できてる。 次は100万個の要素をfor文でガリガリコピーしたものと速度比較。 var list:Array = new Array(); for(var i:int = 0; i < 1000000; i++) list.push(Math.random()); trace("List of "+list.length+" elements."); //for var ts1:Number [...]]]></description>
			<content:encoded><![CDATA[<p>ActionScriptで配列とかディープコピーするのはどんな方法が一般的なんだろうと思って調べてました。<br />
今回は、僕のようなAS初級者向けの内容です。</p>
<p>以下のエントリーでByteArrayを使ってオブジェクトをディープコピーする例がありました。<br />
<a href="http://d.hatena.ne.jp/octech/20080419">ActionScriptでディープコピー</a><br />
おぉ、けっこう簡単。後追いですが僕も検証してみました。</p>
<pre>
var list:Array = [0,1,2,3];

var ba:ByteArray = new ByteArray();
ba.writeObject(list);
ba.position = 0;
var copy:Array = ba.readObject();  

trace(copy);
copy[2] = 4;
trace(copy);
trace(list);

<strong>//出力結果</strong>
0,1,2,3
0,1,4,3
0,1,2,3
</pre>
<p>うん、できてる。<br />
次は100万個の要素をfor文でガリガリコピーしたものと速度比較。</p>
<pre>
var list:Array = new Array();
for(var i:int = 0; i < 1000000; i++) list.push(Math.random());
trace("List of "+list.length+" elements.");

//<strong>for</strong>
var ts1:Number = getTimer();
var copy1:Array = new Array();
for(var j:int = 0; j < list.length; j++) copy1.push( list[j] );
var te1:Number = getTimer();
trace("for(): "+(te1-ts1)+"ms");

//<strong>ByteArray</strong>
var ts2:Number = getTimer();
var ba:ByteArray = new ByteArray();
ba.writeObject(list);
ba.position = 0;
var copy2:Array = ba.readObject();
var te2:Number = getTimer();
trace("ByteArray: "+(te2-ts2)+"ms");

<strong>//出力結果</strong>
List of 1000000 elements.
for(): <strong>363ms</strong>
ByteArray: <strong>464ms</strong>
</pre>
<p>あれ。forの方が早い。ループ処理を最適化してさらに検証。</p>
<pre>
<strong>//最適化前</strong>
var ts1:Number = getTimer();
var copy1:Array = new Array();
for(var j:int = 0; j < list.length; j++) copy1.push(list[j]);
var te1:Number = getTimer();
trace("for(): "+(te1-ts1)+"ms");
<strong>
//最適化後</strong>
var ts1:Number = getTimer();
var copy1:Array = new Array();
var len:int = list.length;
for(var j:int = 0; j < len; j++) copy1[j] = list[j];
var te1:Number = getTimer();
trace("for(): "+(te1-ts1)+"ms");
<strong>
//出力結果</strong>
List of 1000000 elements.
for(): <strong>217ms</strong>
ByteArray: <strong>468ms</strong>
</pre>
<p>ByteArrayで配列コピーすると遅いってことでいいのか。<br />
ただ、100万個も要素コピーすることなんてまずないと思いますけど；<br />
ここで、変数に配列名(copy1 = list)を代入すると配列のシャローコピー(浅いコピー)になりますが、<br />
ループで要素を１つずつ入れてやれば(copy1[j] = list[j])ディープコピーができます。<br />
C言語でも「配列名はアドレス」って大学生の時にしつこく教えられた記憶があります。</p>
<p>また、配列のコピーなら<strong>Array.concat()、Array.slice()</strong>を使っても出来ます。</p>
<pre>
//<strong>slice()</strong>
var ts1:Number = getTimer();
var copy1:Array = list.slice(0, list.length);
var te1:Number = getTimer();
trace("slice(): "+(te1-ts1)+"ms");

//<strong>concat()</strong>
var ts2:Number = getTimer();
var copy2:Array = list.concat();
var te2:Number = getTimer();
trace("concat(): "+(te2-ts2)+"ms");
<strong>
//出力結果</strong>
slice(): <strong>46ms</strong>
concat(): <strong>32ms</strong>
</pre>
<p>concat。速い。<br />
なんか時間をムダにした気がする。。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/103/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>カスタムエフェクト &#8211; Flex</title>
		<link>http://rest-term.com/archives/93/</link>
		<comments>http://rest-term.com/archives/93/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 18:27:22 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=93</guid>
		<description><![CDATA[Flexでカスタムエフェクトを作成するには、いろいろ細かい決まり事を守る必要があります。 各エフェクトはファクトリクラスとインスタンスクラスの2つのクラスによって表現されます。 なので、カスタムエフェクトを作るにはファクトリクラスとインスタンスクラスの2つを作る必要があります。 [ファクトリクラスを作成する] 1. mx.effects.Effect クラスのサブクラスを作成 or 2. mx.effects.Effect クラスのいずれかのサブクラスのサブクラスを作成 ファクトリクラスは、インスタンスクラスのオブジェクトを作成し、そのターゲットオブジェクト上でエフェクトを実行します。 [インスタンスクラスを作成] 1. mx.effects.EffectInstance クラスのサブクラスを作成 or 2. mx.effects.EffectInstance クラスのいずれかのサブクラスのサブクラスを作成 インスタンスクラスは、エフェクトロジックを実装します。 少し長くなるので、エフェクトクラスの実装は続きで.. エフェクトクラスの実装 エフェクトクラスの一部のメソッドとプロパティをオーバーライドします。 また、作成するエフェクトのタイプに応じて、追加のプロパティとメソッドをオーバーライドすることもできます。 ここではカスタムエフェクトを作るのに必要なオーバーライド必須のメソッド・プロパティだけ挙げておきます。 ファクトリメソッド / プロパティ コンストラクタ Effect.initInstance() (ファクトリクラスのプロパティをインスタンスクラスにコピー) Effect.getAffectedProperties() (エフェクトによって変更されるターゲットオブジェクトのプロパティのストリング配列を返す) Effect.instanceClass (エフェクトクラスのインスタンスクラスの名前を指定する Class タイプのオブジェクト) インスタンスメソッド / プロパティ コンストラクタ EffectInstance.play() (エフェクト呼び出し。オーバーライド内から super.play();) TweenEffectInstance.onTweenUpdate() (トゥイーンエフェクトを実装するために一定の時間間隔で呼び出されるコールバックメソッド) これらのメソッド・プロパティをオーバーライドしたクラスを作ればカスタムエフェクトが作れます。 トゥイーンエフェクトを使ったカスタムエフェクトの例は、adobeのlivedocsを見るといいです。 トゥイーンエフェクトについて ファクトリクラスでは、instanceClassプロパティにインスタンスクラス名を指定し、initInstance()でパラメータをインスタンスクラスにコピーしてるだけです。 インスタンスクラスでは、play()、onTweenUpdate()、onTweenEnd()をオーバーライドしていて、このクラスのコンストラクタではcreateTween()によってTweenオブジェクトを作っています。 このTween オブジェクトは、一定の時間間隔でonTweenUpdate()を呼び出し、開始値と終了値の間の補間値をコールバックメソッドに渡します。 livedocsの例ではターゲットのrotationプロパティを変更して単純に回転させていますが、alpha、scaleX、scaleYなども当然扱えます。 [...]]]></description>
			<content:encoded><![CDATA[<p>Flexでカスタムエフェクトを作成するには、いろいろ細かい決まり事を守る必要があります。</p>
<p>各エフェクトは<strong>ファクトリクラス</strong>と<strong>インスタンスクラス</strong>の2つのクラスによって表現されます。<br />
なので、カスタムエフェクトを作るにはファクトリクラスとインスタンスクラスの2つを作る必要があります。</p>
<p>[ファクトリクラスを作成する]<br />
1. mx.effects.Effect クラスのサブクラスを作成<br />
or<br />
2. mx.effects.Effect クラスのいずれかのサブクラスのサブクラスを作成<br />
ファクトリクラスは、インスタンスクラスのオブジェクトを作成し、そのターゲットオブジェクト上でエフェクトを実行します。</p>
<p>[インスタンスクラスを作成]<br />
1. mx.effects.EffectInstance クラスのサブクラスを作成<br />
or<br />
2. mx.effects.EffectInstance クラスのいずれかのサブクラスのサブクラスを作成<br />
インスタンスクラスは、エフェクトロジックを実装します。</p>
<p><img class="alignnone size-full wp-image-94" title="hierarchy_class_effectsmc" src="http://rest-term.com/wp-content/uploads/2008/07/hierarchy_class_effectsmc.jpg" alt="" width="427" height="396" /></p>
<p>少し長くなるので、エフェクトクラスの実装は続きで..</p>
<p><span id="more-93"></span></p>
<h3>エフェクトクラスの実装</h3>
<p>エフェクトクラスの一部のメソッドとプロパティをオーバーライドします。<br />
また、作成するエフェクトのタイプに応じて、追加のプロパティとメソッドをオーバーライドすることもできます。<br />
ここではカスタムエフェクトを作るのに必要なオーバーライド必須のメソッド・プロパティだけ挙げておきます。<br />
<strong>ファクトリメソッド / プロパティ</strong><br />
コンストラクタ<br />
Effect.initInstance()  (ファクトリクラスのプロパティをインスタンスクラスにコピー)<br />
Effect.getAffectedProperties()  (エフェクトによって変更されるターゲットオブジェクトのプロパティのストリング配列を返す)<br />
Effect.instanceClass  (エフェクトクラスのインスタンスクラスの名前を指定する Class タイプのオブジェクト)</p>
<p><strong>インスタンスメソッド / プロパティ</strong><br />
コンストラクタ<br />
EffectInstance.play()  (エフェクト呼び出し。オーバーライド内から super.play();)<br />
TweenEffectInstance.onTweenUpdate()  (トゥイーンエフェクトを実装するために一定の時間間隔で呼び出されるコールバックメソッド)</p>
<p>これらのメソッド・プロパティをオーバーライドしたクラスを作ればカスタムエフェクトが作れます。<br />
トゥイーンエフェクトを使ったカスタムエフェクトの例は、adobeのlivedocsを見るといいです。<br />
<a href="http://livedocs.adobe.com/flex/3_jp/html/help.html?content=createeffects_6.html"> トゥイーンエフェクトについて</a></p>
<p>ファクトリクラスでは、instanceClassプロパティにインスタンスクラス名を指定し、initInstance()でパラメータをインスタンスクラスにコピーしてるだけです。<br />
インスタンスクラスでは、play()、onTweenUpdate()、onTweenEnd()をオーバーライドしていて、このクラスのコンストラクタではcreateTween()によってTweenオブジェクトを作っています。<br />
このTween オブジェクトは、一定の時間間隔でonTweenUpdate()を呼び出し、開始値と終了値の間の補間値をコールバックメソッドに渡します。<br />
livedocsの例ではターゲットのrotationプロパティを変更して単純に回転させていますが、alpha、scaleX、scaleYなども当然扱えます。<br />
また、エフェクトを適用できるのはターゲットオブジェクトに限った話ではありません。<br />
ターゲットとなるオブジェクトをコピーしたUIComponentをかぶせてそれを操作してやれば、オリジナルのターゲット自体は変化させず、それをコピーしたUIComponentだけにエフェクトをかけることもできます。<br />
トゥイーンを使ったエフェクトで肝になるのは、onTweenUpdateメソッドでどんな処理をさせるかですね。</p>
<p><object data="http://rest-term.com/contents/flex/misc/Spring.swf" width="400" height="420" type="application/x-shockwave-flash"><param name="movie" value="Spring.swf" /></object></p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/93/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>メモリ管理 &#8211; Flex</title>
		<link>http://rest-term.com/archives/92/</link>
		<comments>http://rest-term.com/archives/92/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 14:28:08 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=92</guid>
		<description><![CDATA[FlashでもFlexでもメモリリークには気をつけないといけません。 Flex Builderなら強力なプロファイラがあるからいいけど、 FlashDevelopとかでFlexアプリを作る場合の、メモリ使用量の監視と強制GCを行うコード。 &#60;mx:Label id="totalMemory" text="{(System.totalMemory / 1024) + 'KB'}" render="totalMemory.text = (System.totalMemory / 1024) + 'KB'" /&#62; &#60;mx:Button id="gcButton" label="force garbage collection" click="System.gc()" /&#62; System.totalMemoryはFlashPlayerのメモリ使用量、 System.gc()でガベージコレクションプロセスを強制します。(デバッグ版FlashPlayerのみ) FlashDevelopでこれをスニペット化するには、 [Tools] → [General Tools] → [Snippet Editor] → [xml] で上のコードを”TrackMemory”とか好きな名前で登録しとくと便利です。 このコードスニペットを使うにはエディタ上でCtrl+Bで選択するだけ。簡単。 ただ、今はFlex Builderのプロファイラが強力すぎてもう手放せない状況です；]]></description>
			<content:encoded><![CDATA[<p>FlashでもFlexでもメモリリークには気をつけないといけません。<br />
Flex Builderなら強力なプロファイラがあるからいいけど、<br />
FlashDevelopとかでFlexアプリを作る場合の、メモリ使用量の監視と強制GCを行うコード。</p>
<pre>
&lt;mx:Label id="totalMemory"
    text="{(System.totalMemory / 1024) + 'KB'}"
    render="totalMemory.text = (System.totalMemory / 1024) + 'KB'" /&gt;

&lt;mx:Button id="gcButton"
    label="force garbage collection"
    click="System.gc()" /&gt;
</pre>
<p>System.totalMemoryはFlashPlayerのメモリ使用量、<br />
System.gc()でガベージコレクションプロセスを強制します。(デバッグ版FlashPlayerのみ)</p>
<p>FlashDevelopでこれをスニペット化するには、<br />
[Tools]  → [General Tools] → [Snippet Editor] → [xml]<br />
で上のコードを”TrackMemory”とか好きな名前で登録しとくと便利です。<br />
このコードスニペットを使うにはエディタ上でCtrl+Bで選択するだけ。簡単。</p>
<p>ただ、今はFlex Builderのプロファイラが強力すぎてもう手放せない状況です；</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/92/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vista豆知識</title>
		<link>http://rest-term.com/archives/10/</link>
		<comments>http://rest-term.com/archives/10/#comments</comments>
		<pubDate>Tue, 30 Oct 2007 20:41:22 +0000</pubDate>
		<dc:creator>wellflat</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=10</guid>
		<description><![CDATA[フォルダ上にカーソルを合わせてShiftを押しながら右クリックすると、 「コマンド ウィンドウをここで開く」 っていう項目が出現する。 これはコマンドプロンプトをそのフォルダのパスで開いてくれる。 地味に便利。いちいちcdコマンドで移動しなくてすむ。 XPだと「窓の手」とか使えばできたけど、Vistaだと標準でついてる機能。 知らなかった。。]]></description>
			<content:encoded><![CDATA[<p>フォルダ上にカーソルを合わせてShiftを押しながら右クリックすると、<br />
「コマンド ウィンドウをここで開く」<br />
っていう項目が出現する。<br />
これはコマンドプロンプトをそのフォルダのパスで開いてくれる。<br />
地味に便利。いちいちcdコマンドで移動しなくてすむ。<br />
XPだと「窓の手」とか使えばできたけど、Vistaだと標準でついてる機能。<br />
知らなかった。。</p>
]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
