我在使用Air制作的Android游戏中遇到了问题。该应用程序正确定位(保持风景),直到我锁定我正在测试的手机,然后解锁它。当手机解锁时,应用程序将处于纵向模式(它应始终处于横向状态)。
在描述符xml文件中,我将全屏设置为true,纵横比设置为横向并自动定向为false,但这在锁定和解锁时似乎不会影响应用程序(在任何其他情况下都可以完美运行)。它将再次成为肖像,并且在解锁时不会回到横向(所以自动定位是假的肯定没有被干涉)。
此问题仅在您运行游戏并锁定手机并解锁时触发。例如,如果您按下主页按钮以使应用程序不再处于焦点,那么锁定和解锁并重新进入暂停的游戏,它仍将处于风景中。
编辑:我刚刚发现了一个重要的发现!这似乎取决于您在手机上使用何种锁屏。我用的是android 4 galaxy s3。我把它切换到不使用锁定屏幕,当我解锁时应用程序保持在风景中!这是进步。不幸的是,我的朋友有一个不同的Android 4.0手机报告了同样的问题,所以它不仅仅是我的手机。答案 0 :(得分:2)
将此信息添加到应用描述符xml
<aspectRatio>portrait</aspectRatio>
<autoOrients>false</autoOrients>
答案 1 :(得分: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;
}
答案 2 :(得分:0)
我正在讨论同样的问题,这是我关于这个主题的信息。
据我所见,原因是锁定屏幕是主屏幕上的覆盖图,因此为了显示锁定屏幕,显示器与您的应用程序一起被激活(它接收'激活'事件并启动运行)。如果设备在锁定屏幕上默认为纵向(手机大部分都没有,平板电脑大多数都没有),您的应用程序会被拖动以进行骑行,考虑其偏好和AIR清单愿望。
因此,当您的应用程序最终到达前台(用户解锁屏幕)时,它将面向纵向。解决方法是在收到激活事件时手动设置所需的方向。在ICS上有一个额外的怪癖 - 解锁后系统通知栏重新出现(不再是全屏),重新设置阶段到全屏无效。这就是我设法得到的。如果您找到解决方案,我们将不胜感激。
一个相关的问题是,当显示锁定屏幕时,你的游戏开始在下面运行,这是一个糟糕的情况,例如,如果它是一个动作游戏,你停在需要立即输入的东西的中间(比如,任何地方)在游戏里 :-))。 爱会找到解决方案。
答案 3 :(得分: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报告为较短的一侧会发生什么情况,即所有设备都会按照我们的预期报告方向
答案 4 :(得分:0)
我一直有同样的问题......我决定用拳头滚动并将我的游戏重建为流畅的布局,所有内容都重新定位并调整大小。总的来说,它有效,但我宁愿保持景观。我不认为这是谷歌的事情,我认为这是一个Flash CS6问题。当我在CS5.5中发布时,这个错误没有发生,但是我得到了CS6,因为我可以将AIR集成到我的游戏中。我不知道为什么,但那是我的观察。
答案 5 :(得分: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);
}
答案 6 :(得分: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);
}
}
}