StageOrientationEvent не се изпраща в ориентация ПО ПОДРАЗБИРАНЕ (портрет)

Въведение: Имам проект AIR Mobile AS3, където искам да получавам всички събития за ориентация onChange, но никога не позволявам на устройството да завърти екрана (сам правя необходимата промяна). Затова задавам autoOrients=true (необходим за получаване на събития за ориентация) и се опитвам да предотвратя въртенето на устройството чрез e.preventDefault (вече отхвърлено за iOS).

Можете да изтеглите проект на FlashDeveloper с проблема тук. Качете го на устройство с Android и ме уведомете, ако получите StageOrientationEvents при завъртане обратно към Default (Portrait).

Трите други ориентации се задействат добре и получавам от afterOrientation:

  • завъртяно надясно
  • завъртяналяво
  • с главата надолу

Но при завъртане обратно към първоначалната позиция (Protrait) StageOrientationEvent не се задейства.

Моят application.xml е така:

<visible>true</visible>
<fullScreen>false</fullScreen>
<autoOrients>true</autoOrients>
<aspectRatio>any</aspectRatio>
<resizable>true</resizable>

Интересно е, че когато стартирам приложението си на мобилно устройство в пейзаж, получавам:

  • завъртяналяво
  • с главата надолу
  • по подразбиране

Така че отново, при завъртане до първоначалната позиция (в този случай rotatedRight) StageOrientationEvent не се задейства. Първоначалната позиция не дава StageOrientationEvent.

Това е моят слушател:

private function onOrientationChanging(e:StageOrientationEvent):void {

    e.preventDefault();

    ui.console.field.text += "\nORIENTATION_CHANGING "+e.afterOrientation;

    var rot:Number = 0;

    switch (e.afterOrientation){
        case "rotatedRight":
            rot = 90;
            break;

        case "rotatedLeft":
            rot = -90;;
            break;

        case "upsideDown":
            rot = 180;;
            break;
        default:
            rot = 0;
            break;

    }


    TweenMax.to(ui.console.orient, 3, { shortRotation:{rotationZ:rot}, ease:Elastic.easeOut } );

}

Дори се опитах да премахна e.preventDefault() с надеждата, че това по някакъв начин не само деактивира автоматичното завъртане на приложението, но също така по някакъв начин може да предотврати задействането на завъртането по подразбиране. Но това не е така.

Някакви идеи?

Спецификации:

FlashDevelop 5.0

SDK Air17.0 + FLex 4.6.0

Android Nexus 5 Android 5.1.1


person Colonize.bat    schedule 04.06.2015    source източник
comment
Има две събития - промяна на ориентацията и промяна на ориентацията. Проверявате ориентацията, променена вътре в слушател, променящ ориентацията. Отървете се от preventDefault. Ето код за ротация за ios и android mobile: stackoverflow.com/a/30293578/3661764   -  person moot    schedule 05.06.2015
comment
Може би трябваше да спомена, че искам да получавам OrientationChangeEvents, но не искам устройството да се върти. От препратката: Събитието ORIENTATION_CHANGING се изпраща, когато приложението открие, че се извършва промяна и преди действително да се появят някакви поведения по подразбиране, като например автоматична ориентация (обсъдено по-късно). Събитието ORIENTATION_CHANGE възниква, след като възникне някакво поведение на ориентация по подразбиране. Така че в моя случай трябва да използвам ORIENTATION_CHANGING, за да попреча на устройството да завърти екрана при OrientationChange. Как да накарам всички събития OrientationChange да се задействат, но никога да не се въртят?   -  person Colonize.bat    schedule 06.06.2015
comment
Добавих демо връзка към FlashDeveloper Project и също така докладвах този проблем като грешка в Adobe Bugbase тук.   -  person Colonize.bat    schedule 06.06.2015
comment
Защо не използвате акселерометър? Можете да получавате събития за всяко движение.   -  person moot    schedule 09.06.2015
comment
Това няма ли да изтощи доста силно батерията?   -  person Colonize.bat    schedule 09.06.2015
comment
Как акселерометърът изтощава батерията? Трябва да използвате слушатели за всичко.   -  person moot    schedule 10.06.2015
comment
Останах с впечатлението, че наличието на 500ms setRequestedUpdateInterval Listener ще поддържа жироскопа жив и това може да повлияе на батерията. Но аз говорех направо. Ето е SO тема за това. Ще го пробвам. Благодаря ти.   -  person Colonize.bat    schedule 10.06.2015