Я не уверен, что это правильно, я сделал что-то не так в конце, но после долгой борьбы я нашел это стабильное решение:
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, собственно) внимательнее посмотрит на эту проблему и проследит мое решение.
РЕДАКТИРОВАТЬ
Повторно возникает последняя проблема с этим решением, которая возникает, если приложение запускается, когда устройство находится в ориентации DEFAULT или UPSIDE_DOWN, в этом случае приложение будет в портретной ориентации.mode.
Чтобы исправить это, решение состоит в том, чтобы изменить Aspect Ratio внутри обработчика AddedToStage:
if(Stage.supportsOrientationChange) {
stage.setAspectRatio(StageAspectRatio.LANDSCAPE);
}