Flex 4.5 Mobile iOS проблемы с определением фактического разрешения экрана / сцены - PullRequest
6 голосов
/ 04 мая 2011

У меня довольно большая проблема. Я надеюсь, что это из-за моей собственной глупости, а не какой-то ошибки. У меня есть код, который должен знать размеры экрана. Я не нашел надежного способа сделать это. Использование производственной версии Flash Builder 4.5 на устройствах iOS iPad 2 и iPhone4 / iPod Touch 4. В целом, мое приложение работает отлично, но я не могу определить размер экрана и ориентацию во время запуска программы. Позвольте мне объяснить, какие у меня проблемы:

При входе в функцию init, вызываемую событием ADDED_TO_STAGE, значения stage.stageHeight и stage.stageWidth равны 0.

Я могу запросить Capabilities.screenResolutionX и Capabilities.screenResolutionY, но они НЕПРАВИЛЬНЫ. Они имеют необработанные значения X и Y, но независимо от ориентации. Так, например, я запускаю в альбомном режиме, screenResolutionX содержит 768 (или что-то еще) вместо 1024.

Я смотрю на значения stage.width и stage.height, и у них нет действительных значений.

У меня есть настройка функции onResize для EVENT.RESIZE, но она не вызывается, если приложение запускается с устройства, когда оно уже находится в ландшафтном режиме. Если я запускаю приложение в портретном режиме, а затем поворачиваюсь, это вызывается.

Таким образом, мой вопрос заключается в том, что я должен сделать запрос прямо при запуске приложения, чтобы узнать реальную ширину и высоту приложения. Должен быть способ сделать это, но, очевидно, не использовать ни один из методов выше!

Кстати, это на устройствах iOS. Я не могу сказать, как это работает на других. Я подтвердил эти результаты, распечатав их и запустив в отладчике.

Ответы [ 3 ]

4 голосов
/ 01 июня 2012

Краткий ответ:

Самый простой способ - использовать свойства stage.fullScreenWidth и stage.fullScreenHeight .

Они правильно отображают размер экрана для любой ориентации и любых платформ во время запуска (не нужно ждать событий ADDED_TO_STAGE или RESIZE).

Подробнее:

Вкл. Android и Blackberry , AIR сообщает об одинаковых (и правильных значениях) в любое время при использовании любого из следующих свойств:

  • stage.stageWidth & stage.stageHeight
  • Screen.mainScreen.bounds.width & Screen.mainScreen.bounds.height
  • stage.fullScreenWidth & stage.fullScreenHeight

На iOS , при запуске три синтаксиса дают три разных результата (в следующем примере приведены значения для приложения, работающего на iPad2 в альбомном режиме):

  • stage.stageWidth / Height: размер сцены по умолчанию при запуске SWF (500x375)
  • Screen.mainScreen.bounds: физическое разрешение экрана в портретном режиме (768x1024)
  • stage.fullScreenWidth / Height: правильное разрешение экрана в заданной ориентации. (1024x768 - правильно)

Обратите внимание, что в iOS событие RESIZE вызывается два раза при запуске приложения, но значения верны только во второй раз (stage.stageWidth == stage.fullScreenWidth).

1 голос
/ 04 мая 2011

У меня ранее были проблемы с stageWidth и stageHeight, которые не давали правильные значения сразу при запуске, простой способ обойти это - подождать один или два кадра, прежде чем проверять их.

Один из вариантов - отложить инициализацию вашего приложения, примерно так:

private var _startup_delay:int = 10;

public function Constructor(){
    addEventListener(Event.ENTER_FRAME, handleEnterFrame);
}

public function handleEnterFrame(e:Event):void{
    _startup_delay--;
   if(_startup_delay <= 0){
       init();
       removeEventListener(Event.ENTER_FRAME, handleEnterFrame);
    }
}

Другой вариант - вместо этого отправить поддельное событие изменения размера и позволить вашему предыдущему коду ротации обработать его, как только пройдет задержка:

public function handleEnterFrame(e:Event):void{
    _startup_delay--;
   if(_startup_delay <= 0){
       stage.dispatchEvent(new Event(Event.RESIZE));
       removeEventListener(Event.ENTER_FRAME, handleEnterFrame);
   }
}
0 голосов
/ 19 апреля 2012

при запуске приложения, будет

public function Main()
{
    loaderInfo.addEventListener(Event.COMPLETE, _onComplete_loaderInfo);
}

private function _onComplete_loaderInfo(__e:Event):void
{
    // I should now have access to stage.stageWidth/stage.stageHeight.
}

работа для получения разрешения экрана? Я хотел бы заявить, что я НИКОГДА не исследовал это, я просто искал что-то еще и наткнулся на вашу проблему и просто комментировал вслух. Я не говорю, что они будут правильными значениями, но они должны по крайней мере НЕ быть нулем.

...