我不确定这是否是正确的,我最终做错了什么,但经过一番努力,我发现这是一个稳定的解决方案:
private function onAddedToStage(event:Event):void {
if (stage.autoOrients) {
stage.removeEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging);
stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging, false, 100, true);
}
}
private function orientationChanging(event:StageOrientationEvent):void {
event.stopImmediatePropagation();
if (event.afterOrientation == StageOrientation.DEFAULT || event.afterOrientation == StageOrientation.UPSIDE_DOWN) {
event.preventDefault();
}
}
首先要注意的是,addedToStage 在移动应用程序中会触发几次(2-3 次)。我不知道为什么,显然我的代码中没有 addChild 。也许 AIR 运行时会执行其他操作。因此,为了避免添加不必要的处理程序数量,常用的技术是首先删除处理程序 - 如果此类处理程序尚未注册,它不会执行任何操作,但如果存在,它将删除它,这将维护处理程序计数于 1.
第二件事是事件的优先级 - 它在 0 上不起作用,必须将其设置为较大的值,以便在 AIR 运行时中的内容之前启动。
最后一件事 - event.stopImmediatePropagation() - 现在,我们是第一个处理该事件的人,我们无法阻止该事件在这个特定场景中进一步发送。
这使得方向无法完美工作 - 对我来说,横向和反向横向(rotated_left、rotated_right)正在工作和过渡,而纵向模式根本不影响视图。
现在,这里存在危险 - 您可能希望在离开视图时删除侦听器(在过渡动画结束、视图停用或其他情况下),因为 stopImmediatePropagation 将阻止在应用程序的其他部分处理该事件。
我希望 Adobe(实际上是现在的 Apache)能够仔细研究这个问题并追踪我的解决方案。
EDIT
此解决方案还存在最后一个问题,即如果应用程序在设备处于 DEFAULT 或 UPSIDE_DOWN 方向时启动,在这种情况下应用程序将处于纵向模式。
要解决此问题,解决方案是在addedToStage处理程序中更改宽高比:
if(Stage.supportsOrientationChange) {
stage.setAspectRatio(StageAspectRatio.LANDSCAPE);
}