如何在Air for Android中禁用方向更改

我有一个问题,我一直用Android做的Android游戏。该应用程序正确定位(保持风景),直到我锁定我正在测试的手机,然后解锁它。当手机解锁时,应用程序将处于纵向模式(它应始终处于横向状态)。

在描述符xml文件中,我将全屏设置为true,纵横比设置为横向并自动定向为false,但这似乎不会影响应用程序在锁定和解锁时(它在任何其他情况下都能正常工作)。它将再次成为肖像,并且在解锁时不会回到横向(因此自动定位是假的,绝对不会被插入)。

此问题仅在您运行游戏并锁定手机并解锁时触发。例如,如果您按下主页按钮以使应用程序不再处于焦点,则锁定并解锁并返回暂停的游戏,它仍将处于横向状态。

编辑:我刚刚发现了一个重要的发现!这似乎取决于您在手机上使用何种锁屏。我用的是android 4 galaxy s3。我把它切换到不使用锁定屏幕,当我解锁时应用程序保持在风景中!这是进步。不幸的是,我的朋友有一个不同的Android 4.0手机报告了同样的问题,所以它不仅仅是我的手机。

0

8 答案

我有同样的问题。我在几个不同的设备上测试过。如果锁定屏幕需要密码,它们中的大多数实际上会崩溃或获得极端延迟。我的解决方案允许在设备进入睡眠状态后自动定位,然后在设备处于横向状态时再次禁用它。当设备处于纵向状态时,我会隐藏所有内容。仅供参考我还没有测试过所有这些代码,所以可能会遗漏一些东西。

//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
额外

把它放到应用程序描述符xml中

portrait
false
2
额外
只需用aspectRatio标签内的横向替换肖像。
额外 作者 Adrian Pirvulescu,
你能分享你的应用程序描述符和一些代码吗?
额外 作者 Adrian Pirvulescu,
正如我尝试(我想,失败)在我的问题中解释的是我已经尝试过这个,虽然它应该是风景而不是肖像。谢谢你的想法。
额外 作者 Xaduurv,
再一次,我在aspectRatio标签中有LANDSCAPE。肖像从未出现在aspectRatio标签中。
额外 作者 Xaduurv,

我正在讨论同样的问题,这是我关于这个主题的信息。

据我所知,原因是锁定屏幕是主屏幕上的覆盖,因此为了显示锁定屏幕,显示器与您的应用程序一起被激活(它接收'激活'事件并开始运行)。如果设备在锁定屏幕上默认为纵向(电话主要是这样,平板电脑大多不这样做),您的应用程序将被拖动以进行骑行,考虑其偏好和AIR清单愿望。

因此,当您的应用程序最终到达前台(用户解锁屏幕)时,它将面向纵向。解决方法是在收到激活事件时手动设置所需的方向。在ICS上有一个额外的怪癖 - 解锁后系统通知栏重新出现(不再是全屏),重新设置阶段到全屏无效。这就是我设法得到的。如果您找到解决方案,将不胜感激。

一个相关的问题是,当显示锁定屏幕时,你的游戏开始在下面运行,这是一个糟糕的情况,例如,如果它是一个动作游戏,你停在需要立即输入的东西中间(比如,游戏中的任何地方) :-))。将找到解决方案。

0
额外
谢谢jpop!你似乎比我更好地表达了我的问题。其他人似乎没有得到它。不幸的是,我还没有比你更进一步。事实上,我试图手动更改这些东西,而不会破坏纵横比,屏幕尺寸,全屏等,但没有成功。我认为这是一个谷歌问题,在这种情况下,我们是破碎的。我开始怀疑我对平台的选择......团结任何人?
额外 作者 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,

我一直有同样的问题......我决定用拳头滚动并将我的游戏重建为流畅的布局,一切都重新定位和调整大小。总的来说,它有效,但我宁愿保持景观。我不认为这是谷歌的事情,我认为这是一个Flash CS6问题。当我在CS5.5中发布时,这个错误没有发生,但是我得到了CS6,因为我可以将AIR集成到我的游戏中。我不知道为什么,但这是我的观察。

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
额外

我的手机游戏Android应用程序应该是风景模式,当我最小化应用程序后它将以横向模式显示并且屏幕不旋转,但问题是高度和宽度互换。因此显示屏幕的一半仅剩下空白屏幕。如果我们锁定并解锁设备,则根据屏幕尺寸自动调整高度和宽度。

我使用 Event.ACTIVATE 处理了上述问题,如果app处于活动状态,则我重置width,height,scaleX和scaleY。在 4.0,4.1,4.2 版本的android中,它工作正常,但是当我们使用 4.4,5.1 时,它会显示同样的问题。我们怎样才能纠正这个?

0
额外
android Discuss | 辣鸡谷歌毁我信仰
android Discuss | 辣鸡谷歌毁我信仰
1 575 参与者

日常闲聊水 和其他任意讨论聊天瞎扯 只要不是 Sticker Spam 什么都好 少喷政治 @daigua 个人频道 | 因阙丝汀 @DuangCN 瓜体中文 | 语言包 @Nekogram 一只需要关怀的第三方客户端 @AndroidMemory 语录 | 嘿嘿嘿 combot.org/chat/-1001054976571 水表