0

我在使用 Air 为 Android 制作的游戏时遇到问题。该应用程序会正确定位自身(保持横向),直到我锁定我正在测试的手机然后解锁它。当手机解锁时,应用程序将处于纵向模式(它应该始终处于横向)。

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

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

编辑:我刚刚有了一个重要的发现!这似乎取决于您在手机上使用的锁屏类型。我使用的是安卓 4 Galaxy s3。我将其切换为不使用锁定屏幕,当我解锁时应用程序保持在横向!这是进步。不幸的是,我的朋友使用不同的 android 4.0 手机报告了同样的问题,所以不仅仅是我的手机。

4

8 回答 8

2

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

//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;
}
于 2012-09-27T01:18:53.940 回答
2

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

<aspectRatio>portrait</aspectRatio>
<autoOrients>false</autoOrients>
于 2012-06-21T08:14:02.797 回答
0

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

于 2013-02-20T00:01:41.560 回答
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);
}
于 2014-02-06T07:17:18.947 回答
0

从锁屏恢复后,我在强制肖像行为方面也遇到了同样的问题,我使用了类似这样的东西,这似乎有效:

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 报告为短边会发生什么,即所有设备是否都按照我们的预期报告方向

于 2012-09-19T17:58:10.200 回答
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);
        }
    }

}
于 2014-02-28T12:22:28.193 回答
0

我遇到了同样的问题,这是我关于这个主题的信息转储。

据我所见,原因是锁定屏幕是主屏幕上的叠加层,因此要显示锁定屏幕,显示器会与您的应用程序一起被激活(它接收“激活”事件并开始运行)。如果设备在锁定屏幕上默认为纵向(手机大多如此,平板电脑大多不如此),则无论其偏好和 AIR 清单愿望如何,您的应用程序都会被拖走。

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

一个相关的问题是,当显示锁定屏幕时,您的游戏开始在下面运行,例如,如果这是一款动作游戏,而您在需要立即输入的内容(例如,游戏中的任何位置)中间停下来,这是很糟糕的情况:-))。很想找到解决方案。

于 2012-07-15T21:55:40.617 回答
0

我的手机游戏android应用程序应该处于横向模式,当我最小化应用程序后最大化时,它将以横向模式显示并且屏幕不旋转,但问题是高度和宽度互换了。所以它显示了一半的屏幕,剩下的就是空白屏幕。如果我们锁定和解锁设备,高度和宽度会根据屏幕尺寸自动匹配。

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

于 2015-07-15T11:07:33.263 回答