イナヅマTVログ

AIR, HTMLLoaderをNativeWindowにaddChildしてはいけません

| 0件のコメント

AIRでHTMLLoaderを使ってHTMLファイルを表示しようとした時の話。
メインウインドウと別にウインドウを開き表示する必要がありました。

AIRのウインドウのベースとなるクラスはNativeWindowです。
DisplayObjectContainerのようなものだと勝手に推測していました。

HTMLLoaderインスタンスはNativeWindowaddChildしないといけないと思い込んで作業を始めました。
結果、表示はされるのですが通常の数倍に拡大されて表示されてしまいました。
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インスタンスをNativeWindowaddChildするとおかしなことがおこる様子。

NativeWindowのプロパティにアクセスするにはHTMLLoaderインスタンスを介して行わないといけないようです。

htmlLoader.stage.nativeWindow.alwaysInFront = true;

なんかとっても気持ち悪いのですが、これが正解のようです。
あとはHTMLLoaderインスタンスを使ってHTMLファイルをロードします。

htmlLoader.load(new URLRequest("http://www.example.com/"));

コメントを残す

必須欄は * がついています


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください