Air for Androidで方向変更を無効にする方法

私はAir with Android用に作っているゲームに問題があります。アプリは、私がテストしている電話をロックしてからロックを解除するまで、適切な方向付けを続けます(ランドスケープにとどまる)。電話機のロックが解除されると、アプリはポートレートモードになります(常に横長にする必要があります)。

記述子xmlファイルでは、フルスクリーンを縦横比に設定し、縦横比をfalseに設定しましたが、これはロックされていてロックされていない(他のシナリオでは完全に機能します)場合にアプリケーションに影響しないようです。それは再び肖像になり、ロックされていないときは風景に戻らないようになります(したがって、自動方向は間違いであることは間違いないです)。

この問題は、ゲームを実行しているときにのみ起動し、電話をロックしてロックを解除します。たとえば、ホームボタンを押してアプリケーションにフォーカスがないようにして、ロックしてロックを解除し、一時停止したゲームに戻った場合、それはまだランドスケープになります。

編集:私はちょうど重要な発見をした!これはあなたの携帯電話で使用するロック画面の種類に依存しているようです。私はアンドロイド4銀河s3を使用します。私はロック画面を使用しないように切り替えると、私はロック解除時にアプリは風景にとどまった!これは進歩です。残念ながら、アンドロイド4.0の別の電話を持っている私の友人は同じ問題を報告しているので、それは私の電話だけではありません。

0

8 答え

私は同じ問題があります。私はいくつかの異なるデバイスでテストしました。ロック画面にパスワードが必要な場合は、ほとんどが実際にクラッシュしたり、極端な遅れが発生します。私の解決策では、デバイスがスリープ状態になった後で自動配向が可能になり、その後、デバイスがランドスケープになったら再び無効になります。デバイスが肖像画になっている間、私はすべてのコンテンツを隠しています。 FYI私はまだこのコードのすべてをテストしていないので、何かが見つからない可能性があります。

//Before the device goes to sleep, enable auto-orientation
NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true);
function handleDeactivate(e:Event):void
{
    stage.autoOrients = true;

    //listen for the device to re-activate
    e.currentTarget.addEventListener(Event.ACTIVATE, handleActivate, false, 0, true);
}

//Once the device is re-activated, check the orientation.
function handleActivate(e:Event):void
{
    e.currentTarget.removeEventListener(Event.ACTIVATE, handleActivate, false, 0, true);

    //if the orientation is portait, just listen for an orientation change
    if (stage.stageHeight > stage.stageWidth)
    {
        //It makes sense that you would just use stage.setAspectRatio(StageAspectRatio.LANDSCAPE) here,
        //however in my experience I've found that setting the aspect ratio here seems to cause an infinite loop of the device attempting to reset the orientation.
        //Instead, I will wait for the user to change orientation, and then lock it in landscape
        stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGE, onOrientationChange);
    }
    else
    {
        disableAutoOrientation();
    }
}

//Check if the new orientation is landscape. If so, disable orientation changes.
function onOrientationChange():void
{
    if (stage.stageWidth > stage.stageHeight)
    {
        stage.removeEventListener(StageOrientationEvent.ORIENTATION_CHANGE, onOrientationChange);
        disableAutoOrientation();
    }
}

//disable the auto-orientation feature
function disableAutoOrientation():void
{
    stage.autoOrients = false;
}
2
追加された

これをapp記述子xmlに入れる

portrait
false
2
追加された
aspectRatioタグ内の風景を縦に置き換えます。
追加された 著者 Adrian Pirvulescu,
あなたのアプリケーションディスクリプタといくつかのコードを共有できますか?
追加された 著者 Adrian Pirvulescu,
私の質問で説明しようとした(そして私が推測したところでは、失敗した)のは、私がすでにこれを試したことです。しかし、考えをありがとう。
追加された 著者 Xaduurv,
もう一度、aspectRatioタグにLANDSCAPEがあります。ポートレートはaspectRatioタグ内に決して存在していません。
追加された 著者 Xaduurv,

私は同じ問題を抱えて頭を上げています。ここに私の話題があります。

私が見る限り、ロック画面はメイン画面上のオーバーレイであるため、ロック画面を表示するために、アプリケーションが起動されます( 'activate'イベントを受信して​​実行を開始します)。デバイスがロック画面で縦向きにデフォルト設定されている場合(ほとんどの場合、タブレットはそうではありません)、あなたのアプリケーションは、その設定とAIRマニフェストの要望を考慮して、乗車のためにドラッグされます。

その結果、アプリが最終的にフォアグラウンドになると(ユーザーが画面のロックを解除したとき)、アプリは縦向きになります。この問題を回避するには、イベントをアクティブにするときに手動で目的の方向を設定します。 ICSに追加された奇妙な点があります。システムの通知バーは、ロック解除後も再表示されます(これ以上のフルスクリーンはありません)。また、ステージをフルスクリーンに再設定しても効果はありません。そしてそれは私が得ることができる限りです。あなたが解決策を見つけたら通知を感謝します。

関連する問題は、ロック画面が表示されているときにゲームが下を走り始めることです。たとえば、アクションゲームで、即時の入力が必要な途中で停止した場合(ゲームのどこでも:-))。それに対する解決策を見つけるためにしますか?

0
追加された
おかげでjpop!あなたは私の問題を私ができる以上に明確に表現したようです。他の人はそれを手に入れていないようでした。残念ながら、私はあなたよりこれ以上何も得ていません。私は手動でアスペクト比、画面サイズ、フルスクリーンなどをうまく使わずに手動で変更しようとしました。私はこれがGoogleの問題だと思っています。その場合、私たちは恐怖を感じています。私はプラットホームの私の選択を疑うようになっています...一体誰ですか?
追加された 著者 Xaduurv,

私は、ロックスクリーンから再開した後の強制的な肖像画の動作に関して、年齢についても同じ問題を抱えていました 私はこれがうまくいくような何かを使用しました:

stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGE, onOrientationChange, false, 0, true);

private function onOrientationChange():void
{
    if (stage.stageWidth > stage.stageHeight)
    {
        stage.setAspectRatio(StageAspectRatio.PORTRAIT);
    }
    else
    {
        stage.setAspectRatio(StageAspectRatio.LANDSCAPE);
    }
}

デバイスがstageWidthを長辺、stageHeightを短辺と報告した場合、つまり、すべてのデバイスが方向を報告していればどうなるのかはわかりません

0
追加された
実際には(!!)固定された向きのために私はこれを使用して、私も困惑しましたが、今は常にポートレートのstage.addEventListener(Event.ACTIVATE、onActivate、false、0、true);プライベート関数onActivate(e:Event):void {stage.setAspectRatio(StageAspectRatio.LANDSCAPE); }
追加された 著者 bikutaa,

私はまったく同じ問題を抱えてきました。私はパンチでロールし、私のゲームを流体レイアウトに再構築し、すべてが位置を変えてサイズを変更することに決めました。全体的にはうまくいきましたが、私は景観にとどまることを好みました。私はそれがGoogleのものだとは思わないが、私はそれがFlash CS6の問題だと思う。このバグはCS5.5で公開したときには発生しませんでしたが、AIRをゲームに統合できるため、CS6を取得しました。私はなぜそれがわかりませんが、それは私の観察です。

0
追加された

周囲にうんざりした後、私はデバイス上で確実に動作する簡単なソリューションを見つけました。基本的には、起動されているアプリケーションをリスンしてから、向きを元に戻します。

NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, onDeactivate);

private function onDeactivate(e:Event):void
{
    this.addEventListener(Event.ACTIVATE, onActivate);
}

private function onActivate(e:Event):void
{
    this.removeEventListener(Event.ACTIVATE, onActivate);

    if(stage.deviceOrientation == StageOrientation.ROTATED_RIGHT)
        stage.setOrientation(StageOrientation.ROTATED_LEFT);
    else
        stage.setOrientation(StageOrientation.ROTATED_RIGHT);
}
0
追加された

私はそれが古いスレッドだと思うが、私はちょうどこの同じ問題を自分で持っていた、そして、これは私のために問題を解決するように思われた。余分なリスナーはやや原油ですが、それは動作します。

var default_orientation:String;
default_orientation=stage.orientation;

stage.addEventListener(Event.ENTER_FRAME,check_if_stage_is_rotated);

function check_if_stage_is_rotated(e:Event):void{
    if (stage){
        if(stage.orientation!=default_orientation){
            stage.setOrientation(default_orientation);
        }
    }

}
0
追加された

私のモバイルゲームアンドロイドアプリはランドスケープモードにする必要があります。アプリを最小化して横長モードで表示し、画面を回転させないで最大化すると、高さと幅が入れ替わる問題があります。したがって、画面の半分と表示されたのは空白画面のみでした。デバイスをロックしたりロックを解除したりすると、自動的に画面のサイズに合わせて高さと幅が調整されます。

上記の問題は、 Event.ACTIVATE を使用して処理しました。アプリがアクティブな場合は、幅、高さ、scaleXおよびscaleYをリセットします。 Android 4.0の 4.0,4.1,4.2 バージョンでは正常に動作していますが、 4.4、5.1 を使用した場合は同じ問題が発生します。どうすればこの問題を解決できますか?

0
追加された