Archive for 2009/5/27
AIRでアプリケーションを作成していると、アプリケーションのサイズを指定するわけだが、でも起動後にサイズを変更するわけだ。
私なんかは、ノートの場合、たいてい最大化してしまう。
しかし、大きなディスプレイのときにはそうでもなかったする。
要するにアプリケーションのサイズは前回閉じたときの大きさで再現できればより親切だろう。
こうなるとAIRのアプリケーションで閉じるときに値を保存しておかなければいけない。
保存しておくデータは、サイズと状態(最大?通常?)というデータだ。
理屈は、閉じるときに保存し、起動時に読み込み、そのサイズ、もしくは状態に変更させればいいわけだ。
さて、こうなると、サイズの取得と、状態の取得をする必要がある。
サイズの取得はWindowedApplicationのオブジェクトのwidthとheightをとればいいわけだが、状態を取るのはどうすればいいのだろうか?
実は、状態と記述しているところに訳がある。私ははじめ、「最大にした時」というのを探してしまった。こう考えてしまったために、たどり着くまでに時間がかかってしまったが、状態の変化は、以下のようにイベントでとれるのだ。
以下のように、状態が変わったときと、アプリケーションが閉じるときのイベントで処理をするようにする。
// thisはWindowedApplicationのインスタンス this.addEventListener(NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGE,windowStateChange); this.addEventListener(Event.CLOSING,windowClosing);
これで、状態が変わったときにその状態を変数に保存しておき、アプリケーションが閉じるときに保存すればいい。というわけだ。
具体的にはこんな感じだ。
private function windowStateChange(e:NativeWindowDisplayStateEvent):void{
this.windowState = e.afterDisplayState;
}
次にをアプリケーションが閉じるときのイベントだが、
private function windowClosing(e:Event):void{
props.saveValue("window.height",String(this.height));
props.saveValue("window.width",String(this.width));
props.saveValue("window.state",this.windowState);
}
上のprops.saveValueというメソッドは私が作ったもので、実際にはここでプロパティ情報を管理するDB(sqlite)に値を保存している。
ここでは、どのような方法を使ってもいいのでローカルに保存できればいいのだが、後で値が簡単に見えるのと、変更も可能なのでテストしやすいために私はそうしただけだ。
ここまでできれば、今度は次回の起動時にこれを再現するだけだ。
再現は、WindowedApplicationにcreationComplete=”createEnd()”のように関数を登録し、
private function createEnd():void{
this.windowState = props.getValue("window.state");
if(this.windowState == NativeWindowDisplayState.MAXIMIZED){
this.maximize();
}
else{
saveWidth = props.getNumberValue("window.width");
if(saveWidth > 0 ){
this.width = saveWidth;
}
saveHeight = props.getNumberValue("window.height");
if(saveHeight > 0 ){
this.height = saveHeight;
}
}
}
ここででも、props.getValueとprops.getNumberValueがあるが、これは保存した値を読むように私が作ったものなので、ここは各自にあった実装をしてほしい。
また、ここでは状態が最大しか考慮していないが、状態には、通常、最小、最大がある。
しかし、最小にしたいということはありえないと思うので、最大の場合だけ最大にし、それ以外は前回のサイズにしている。
これを応用すれば、それ以外にもアプリケーション特有の再現はできるとおもいますので、ますます、AIRとしての(クライアントアプリケーションとして)メリットが出せるのではないでしょうか?

