AIRでHTMLLoaderを使ってHTMLファイルを表示しようとした時の話。
メインウインドウと別にウインドウを開き表示する必要がありました。
AIRのウインドウのベースとなるクラスはNativeWindow
です。
DisplayObjectContainer
のようなものだと勝手に推測していました。
HTMLLoader
インスタンスはNativeWindow
へaddChild
しないといけないと思い込んで作業を始めました。
結果、表示はされるのですが通常の数倍に拡大されて表示されてしまいました。
scaleX, scaleYが7~8な感じです。
落ち着いてAPIドキュメントを読み直しです。
まずウインドウを作ります。
var option:NativeWindowInitOptions = new NativeWindowInitOptions(); option.resizable = false; option.systemChrome = NativeWindowSystemChrome.NONE; option.transparent = false; option.type = NativeWindowType.LIGHTWEIGHT; var bounds:Rectangle = new Rectangle(0, 0, 400, 300); var htmlLoader:HTMLLoader = HTMLLoader.createRootWindow(true, option, true, bounds); |
HTMLLoader.createRootWindow
がポイントになります。
via:API Document
http://help.adobe.com/ja_JP/AS3LCR/Flex_4.0/flash/html/HTMLLoader.html?allClasses=1#createRootWindow()
HTMLLoader オブジェクトを格納する新しい NativeWindow オブジェクトを作成します。このメソッドによって返された HTMLLoader オブジェクトを使用して、HTML コンテンツをロードします。
デフォルトでは(このメソッドの呼び出し時にパラメーターを設定しなかった場合)、新しいウィンドウには標準のシステムクロムが使用され、コンテンツの ScrollBar コントロールが含まれます。新しいウィンドウのプロパティを変更するには、パラメーターを設定します。
ウィンドウにコンテンツを読み込み、スタイルシートを適用すると、グラフィックに関して重大ではない問題が発生する場合があります。このような不具合が表示されるのを防ぐには、visible パラメーターを false に設定します。ウィンドウがコンテンツを読み込んでレイアウトすると、window.nativeWindow.visible プロパティを true に設定するか、window.nativeWindow.activate() メソッドを呼び出して、そのコンテンツを表示します。
HTMLLoader.createRootWindow
した時点でHTMLLoader
は自分がのっかる親ウインドウNativeWindow
を自ら作り出してすでに乗っかってしまっているようです。
このHTMLLoader
インスタンスをNativeWindow
へaddChild
するとおかしなことがおこる様子。
NativeWindow
のプロパティにアクセスするにはHTMLLoader
インスタンスを介して行わないといけないようです。
htmlLoader.stage.nativeWindow.alwaysInFront = true; |
なんかとっても気持ち悪いのですが、これが正解のようです。
あとはHTMLLoader
インスタンスを使ってHTMLファイルをロードします。
htmlLoader.load(new URLRequest("http://www.example.com/")); |