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

У меня довольно большая проблема. Я надеюсь, что это из-за моей собственной глупости, а не какой-то баг. У меня есть код, который должен знать размеры экрана. Я не нашел надежного способа сделать это. Использование рабочей версии 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-устройствах. Я не могу сказать, как это работает на других. Я подтвердил эти результаты, распечатав результаты и запустив их в отладчике.


person Rich Sadowsky    schedule 03.05.2011    source источник
comment
Я нашел решение для этого. Решение @grapefrukt тоже может сработать. Мой не требует ожидания после ADDED_TO_STAGE. Он просто оборачивает геттеры для этих значений некоторыми правилами здравого смысла, например, если значение state.orientation указывает на один из ландшафтных режимов, но ширина меньше высоты, то значения меняются местами. Просто потратил некоторое время на тестирование и работал в 100% тестовых случаев. Был бы рад очистить его и поделиться, если кому-то еще нужно решение этой проблемы.   -  person Rich Sadowsky    schedule 05.05.2011
comment
опубликуйте код как ответ вики сообщества, и вы сами сможете принять его как правильный ответ.   -  person grapefrukt    schedule 05.05.2011
comment
@Rich, я сейчас делаю то же самое, не могли бы вы опубликовать этот код где-нибудь, чтобы я мог визуализировать то, что вы говорите?   -  person jlehenbauer    schedule 22.07.2011


Ответы (3)


Раньше у меня были проблемы с 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);
   }
}
person grapefrukt    schedule 03.05.2011
comment
Я попробовал метод, который вы указали, и я могу надежно получить stage.stageWidth и stage.StageHeight, но значения не имеют для меня никакого смысла. Мое устройство 480x800 (Galaxy S), но сцена с размером 500 и высотой 375. Есть идеи? - person b-ryce; 05.05.2011
comment
Я тоже получаю эти значения. Вместо этого я бы рекомендовал fullStageWidth и fullStageHeight. Я только что написал код, который надежно возвращает значения. В основном он использует stage.orientation для проверки значения по умолчанию или вверх ногами. Любой из них указывает портретный режим, и значения в fullStageWidth и fullStageHeight должны быть в порядке. Когда я нахожу ландшафтный режим, я вижу, соответствует ли высота › ширине (как указано Capabilities.screenResolutionX/Y) и меняет значения, если ориентация альбомная, а h › w. Kludgy by доказал свою эффективность на 100 % и не требует ожидания после ADDED_TO_STAGE. - person Rich Sadowsky; 05.05.2011
comment
@Rich Как получить значения для fullStageWidth и fullStageHeight? - person sydd; 07.12.2011

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

Самый простой способ — использовать свойства 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).

person boblemarin    schedule 01.06.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.
}

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

person WORMSS    schedule 19.04.2012