« Adobe Apollo アルファ版公開 | Main | LCDS 2.5 ベータ公開 »
March 20, 2007
Apollo でブラウザを作る の続き
”戻る” ボタンの追加
前回作った MyBrowser に一つ前のページに戻る機能を追加してみたいと思います。
まず、ボタンを一つ追加します。”移動” ボタンの次の行に Botton タグを ”戻る” というラベルで追加します。
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:HBox>
<mx:TextInput id="inputTF" width="225" text="http://"/>
<mx:Button label="移動" click="html.location = inputTF.text;"/>
<mx:Button label="戻る" click="back()"/>
</mx:HBox>
<mx:HTML id="html" width="100%" height="100%"/>
</mx:ApolloApplication>
追加した Button タグ内に click="back()" という記述がありますが、これは ”戻る” ボタンがクリックされたら back() という関数を呼び出すという指定です。
次はこの back() 関数を記述します。MXML 内に ActionScript を記述するには Script タグを使います。下の例にあるように Script タグで囲まれた範囲にはスクリプトを書くことができます。
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
// ここにスクリプトを記述
private function back():void {
}
]]>
</mx:Script>
<mx:HBox>
<mx:TextInput id="inputTF" width="225" text="http://"/>
<mx:Button label="移動" click="html.location = inputTF.text;"/>
<mx:Button label="戻る" click="back()"/>
</mx:HBox>
<mx:HTML id="html" width="100%" height="100%"/>
</mx:ApolloApplication>
back() 関数内では一つ前の URL を HTML コンポーネントの location プロパティ、すなわち html.location に設定することになります。(HTML コンポーネントの詳しい使い方は別の機会に説明します) そうすると以前のURLを覚えている必要がありますので、履歴を保持するための配列も一つ定義します。スクリプトの箇所は、以下のようになります。
<mx:Script>
<![CDATA[
// この配列に現在表示中の URL までが記録されている
private var history:Array = new Array();
private function back():void {
if (history.length > 1) {
history.pop(); // 現在の URL を廃棄
var prevURL:String = history[history.length - 1]; // 最終エントリを取得
html.location = prevURL; // HTML コンポーネントに URL を設定
inputTF.text = prevURL; // 入力テキストフィールドの表示も変更
}
}
]]>
</mx:Script>
あとは URL が変更される毎に history 配列に URL を追加する仕組みを作れば出来上がりです。HTML コンポーネントは、指定された URL からリソースの読み込みが完了すると complete というイベントを発生しますので、これを使ってみることにします。
まず、HTML コンポーネントのタグを使ってイベントハンドラを設定します。
<mx:HTML id="html" width="100%" height="100%" complete="pushURL(event)"/>
今回は pushURL() という関数を呼ぶように指定しました。pushURL() の中身はこんな感じです。
private function pushURL(e:Event):void {
// 現在の location を配列に記録
history.push(html.location);
// あわせて入力テキストフィールドの表示も変更
inputTF.text = html.location;
}
以上で ”戻る” ボタンらしきものが出来たと思います。以下は全体のコードです。
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
// この配列に現在表示中の URL までが記録されている
private var history:Array = new Array();
private function back():void {
if (history.length > 1) {
history.pop(); // 現在の URL を廃棄
var prevURL:String = history[history.length - 1]; // 最終エントリを取得
html.location = prevURL; // HTML コンポーネントに URL を設定
inputTF.text = prevURL; // 入力テキストフィールドの表示も変更
}
}
private function pushURL(e:Event):void {
// 現在の location を配列に記録
history.push(html.location);
// あわせて入力テキストフィールドの表示も変更
inputTF.text = html.location;
}
]]>
</mx:Script>
<mx:HBox>
<mx:TextInput id="inputTF" width="225" text="http://"/>
<mx:Button label="移動" click="html.location = inputTF.text;"/>
<mx:Button label="戻る" click="back()"/>
</mx:HBox>
<mx:HTML id="html" width="100%" height="100%" complete="pushURL(event)"/>
</mx:ApolloApplication>
Apollo アプリケーションの配布
作成したアプリケーションを配布するには air パッケージを作成します。Flex Builder の場合は、まずメニューバーから File -> Export と選択します。そうすると Flex Builder は以下のパネルを表示します。

Deployable AIR File を選択して Next ボタンを押します。今度は下図のように Apollo Deployment Export Wizard が表示されます。MyBrowser-app.xml ファイルを選んで Wizard 下部の Finish ボタンを押します。これで air ファイルが作成され、Navigator パネル内の MyBrowser.mxml の上あたりに表示されます。

今回作成した air ファイルに含まれるのは上で指定した xml ファイルと MyBrowser.swf の2つのみです。上記のパネルが表示された状態で、Finish の代わりに Next を押すと他に air ファイルに含めたいファイルを指定することもできます。
air ファイルをダブルクリックするとインストーラが起動されます。

Posted by ackie at March 20, 2007 05:40 PM
Comments
こんばんわ~
僕も作ってる最中なのですが、プログレスバーが作れなくて困ってます。
loaderInfo.bytesLoadedはloader自体のサイズを返すだけで、ロードしたHTMLのサイズを返さないんですね。。。
どうやって習得できるのでしょうか?
Posted by: niea at March 20, 2007 11:13 PM
niea さん、こんにちは。
いまのところ Apollo のコンポーネントにはそのような機能は無いようです。ルートの HTML のサイズだけ分かればよいのでしょうか?
詳細をいただければリクエスト出してみます。
Posted by: ackie at March 23, 2007 05:49 PM
Thanks for very interesting article. Can I translate your article into polish and publish at my website?
I will back here and check your answer. Keep up the good work.
Posted by: Peter at October 19, 2007 08:57 AM
niea さん、こんにちは。
いまのところ Apollo のコンポーネントにはそのような機能は無いようです。ルートの HTML のサイズだけ分かればよいのでしょうか?
Posted by: sharp aquos at December 20, 2007 06:04 AM