4

横向きにロックしたい AIR アプリケーションがあります。アプリケーションを縦向きモードに回転させたくありません。この問題に対する Adob​​e の解決策は、私の *-app.xml ファイルを次のように構成することです。

<!-- The initial aspect ratio of the app when launched (either "portrait" or "landscape"). Optional. Mobile only. Default is the natural orientation of the device -->
<aspectRatio>landscape</aspectRatio>
<!-- Whether the app will begin auto-orienting on launch. Optional. Mobile only. Default false -->
<autoOrients>false</autoOrients>

これはほとんどの場合機能しますが、常に機能するとは限りません。たとえば、Android の特定のフレーバー (例: 2.x、Nook タブレットで実行) で、Flash Builder が APK をパッケージ化してデプロイしているときにデバイスの画面がオフになると、アプリは半分壊れた状態で起動し、アスペクト比が横向きですが、すべて縦向きの寸法で測定されています。Google Nexus (Android 4.1) などの他のデバイスでは、アプリケーションは (横向きモードで) 正しく起動しますが、画面をオフにし、デバイスを縦向きモードに回転させ、画面をオンに戻すと、AIR アプリが見えなくなりました。再びポートレートモードに回転。さらに悪いことに、これが発生したことを示すために StageOrientationEvent.ORIENTATION_CHANGE イベントがディスパッチされることさえありません。

上記のアプローチの変形を試しました。これは、デバイスの向きをプログラムで設定することです。

private function onAddedToStage( event:Event ):void {
    stage.autoOrients = false;
    stage.setOrientation( StageOrientation.ROTATED_RIGHT );
}

このアプローチには、上記と同じ問題があります。

この他の Stack Overflow スレッド で言及されているアプローチも試しました。自動方向を無効にする代わりに、StageOrientationEvent.ORIENTATION_CHANGE をリッスンして、デバイスが縦向きモードにならないようにしました。

private function onAddedToStage( event:Event ):void {
    stage.addEventListener( StageOrientationEvent.ORIENTATION_CHANGE, onStageOrientationChange, true, int.MAX_VALUE );
}

private function onStageOrientationChange( event:StageOrientationEvent ):void {
    switch( event.afterOrientation ) {
        case StageOrientation.DEFAULT:
        case StageOrientation.UPSIDE_DOWN:
        case StageOrientation.UNKNOWN:
            event.preventDefault();
            break;
        case StageOrientation.ROTATED_RIGHT:
        case StageOrientation.ROTATED_LEFT:
            break;
    }
}

これも、たまにしか機能しないようです。多くの場合、event.preventDefault() は効果がなく、アプリケーションはローテーションします。

そこで...他の AIR 開発者への私の質問は次のとおりです。デバイスを単一の向きに確実にロックする方法を知っている人はいますか?

4

1 に答える 1

4

これは、Android 2.3 (Fire and Nook) と 4.1 (Nexus 7) でうまくいくことがわかったアプローチです。まだ他のデバイスでテストしていませんが、これまでのところ有望なようです.

まず、-app.xml 構成を次のように設定しました。

<aspectRatio>landscape</aspectRatio>
<autoOrients>false</autoOrients>

次に、spark アプリケーションに次のコードを追加しました。

private function onAddedToStage():void {
    stage.addEventListener( Event.RESIZE, onStageResize );
    NativeApplication.nativeApplication.addEventListener( Event.ACTIVATE, onNativeApplicationActivate );
}

private function onStageResize( event:Event ):void {
    checkForOrientationChange();
}

private function onNativeApplicationActivate( event:Event ):void {
    checkForOrientationChange();
}

private function checkForOrientationChange():void {
    if ( height > width ) {
        if ( stage ) {
            stage.setOrientation( StageOrientation.ROTATED_RIGHT );
        } else {
            // The first ACTIVATE event occurs before the Application has been added to the stage
            callLater( checkForOrientationChange );
        }
    }
}
于 2012-09-05T12:55:13.903 に答える