我该如何在使用AIR移动版的Android设备上正确控制舞台方向?

4

我有一个AIR应用程序,希望将其锁定为横向模式。我永远不希望应用程序旋转到纵向模式。Adobe似乎推荐的解决方案是将我的*-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 Tablet)中,当 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开发人员:是否有可靠的方法可以将设备锁定为单一方向?


通过以下方式看到一些有前途的结果:(a) 听取Event.RESIZE事件的舞台和NativeApplication中的Event.ACTIVATE事件。(b) 检查height > width,如果是,则调用stage.setOrientation( StageOrientation.ROTATED_RIGHT );在我知道这种方法是否真正稳定之前,需要进行更多测试(在更多设备上)。 - bvaughn
如果你找到了可靠的东西,请告诉我们。目前(截至AIR 3.4)在Android设备上,舞台方向确实有点奇怪。 - AlBirdie
到目前为止,我只在几个设备上进行了测试:Nexus 7(Android 4.1),Kindle Fire和Nook Tablet(Android 2.3)-但似乎我已经找到了解决方法。我将在下面添加它作为自己的评论,以便我可以发布可读的源代码。 - bvaughn
1个回答

4

以下是我发现适用于Android 2.3(Fire和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 );
        }
    }
}

2
关于这种方法需要注意的一点是:它在像三星Galaxy Tab这样默认为横向屏幕的设备上似乎不能可靠地工作。 - bvaughn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接