2010年5月6日木曜日

AdobeAIRでサイズの再計算

空うさぎで、通知画面の改造を行っています。
今までは、前面に全画面を覆う透明のパネルを一つ貼って、その中に通知パネルをペタペタ貼っていたのですが、これでは問題が。
こぅすると、その他のアプリで前面表示するものと競合するようで、FireFoxのダウンロード完了ウィンドウとか、GoogleChromeでのタブの順番を移動しようとすると上手く行かなくなってしまいました。

そもそも、透明パネル対応をしたかというと、ウィンドウ(mx:Window)を作って消すというのは凄く負担のかかる処理で、CPUの消費も尋常じゃない><
通知の画面なんて、絶えずいっぱい出して閉じるものなので、それだとキツイんですよね。

で、今回の空うさぎでは、透明パネルをやめ、通知用ウィンドウを再利用することによりCPUの消費も押さえつつ、問題解決を試みています。

ここで問題が出たのが通知用のウィンドウのサイズ変更。
通知用ウィンドウは、表示する文字のサイズによって高さを自動的にぴったりになるように表示するようにしたい。
mxmlの設定ではheightの設定は行わず、自動的に計算するのに任せていました。

こーすると、ウィンドウ再利用時、上手く再計算をしてくれない。
AdobeAIRでは、サイズが指定されていないため計算を行った値を explicitWidth, explicitHeight という変数に格納しています。
一度計算がおわったものについてはこの値を使い、再計算を省くことにより速度を改善するんですね。

もちろん、width, height の属性に値を設定していればその値が使用されます。
実際どんな値を使うのか? は、getExplicitOrMeasuredHeight() , getExplicitOrMeasuredWidth() というメソッドが使えます。

ということで、計算させたいコンポーネントにて
explicitHeight = NaN;
explicitWidth = NaN;
validateNow();

をしてあげることにより、再計算してくれるようになりました。

mx:Textに入れた文字列の表示サイズを判定については、
1行のものであれば、measureText(txt)メソッドで取得できるTextLineMetricsから取得できます。
が、複数行になるものであれば、上記のvalidateNow() してあげれば大丈夫です。

ここらへんの、サイズ変更については、SwingでもSWTでもハマったな。
まぁーまだマシに解決できたAdobeAIRは良いのかも。

さて、次回の空うさぎは↑の処理を加えつつ、通知ウィンドウでいろんな処理ができるようになります。
お楽しみにー。
• • •