确定实际屏幕/舞台分辨率的 Flex 4.5 移动 iOS 问题

Posted

技术标签:

【中文标题】确定实际屏幕/舞台分辨率的 Flex 4.5 移动 iOS 问题【英文标题】:Flex 4.5 Mobile iOS problems with determining actual screen/stage resolution 【发布时间】:2011-08-18 00:30:54 【问题描述】:

我遇到了一个相当大的问题。我希望这是由于我自己的愚蠢而不是某种错误。我有需要知道屏幕尺寸的代码。我还没有找到可靠的方法来做到这一点。在 iPad 2 和 iPhone4/iPod Touch 4 ios 设备上使用 Flash Builder 4.5 的生产版本。一般来说,我的应用程序运行良好,但我无法在程序启动时确定屏幕大小和方向。让我解释一下我遇到的问题:

进入由ADDED_TO_STAGE事件调用的“init”函数时,stage.stageHeight和stage.stageWidth的值都是0。

我可以查询 Capabilities.screenResolutionX 和 Capabilities.screenResolutionY,但它们是错误的。它们具有原始 X 和 Y 值,但与方向无关。因此,例如,我通过 screenResolutionX 以横向模式开始包含 768(或其他)而不是 1024。

我查看了 stage.width 和 stage.height 的值,它们没有有效值。

我为 EVENT.RESIZE 设置了 onResize 函数,但如果应用程序在已经处于横向模式时从设备启动,则不会调用它。如果我以纵向模式启动应用程序然后旋转,这会被调用。

所以我的问题是我应该在应用程序启动时查询什么来了解应用程序的实际宽度和高度。一定有办法做到这一点,但显然不使用上述任何方法!

顺便说一句,这是在 iOS 设备上。我不能说它是如何对其他人起作用的。我已经通过打印结果和在调试器中运行来确认这些结果。

【问题讨论】:

我找到了解决方案。 @grapefrukt 的解决方案也可以。我的不需要等待超过 ADDED_TO_STAGE。它只是用一些常识规则包装这些值的 getter,例如如果 state.orientation 值指示一种横向模式但宽度小于高度,则交换这些值。刚刚花了一些时间进行测试,并在 100% 的测试用例中工作。如果其他人需要解决此问题,我很乐意清理并分享。 将代码发布为社区 wiki 答案,您可以自己接受它作为正确答案。 @Rich,我现在也在做类似的事情,你介意把这段代码贴在某个地方,这样我就可以看到你在说什么吗? 【参考方案1】:

简答:

最简单的方法是使用 stage.fullScreenWidthstage.fullScreenHeight 属性。

它们在启动时正确报告任何方向和任何平台的屏幕尺寸(无需等待 ADDED_TO_STAGE 或 RESIZE 事件)。

更多详情:

androidBlackberry 上,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)。

【讨论】:

【参考方案2】:

在应用启动时,会

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.

为获取屏幕资源而工作?我想说,我没有对此进行任何研究,我只是在寻找其他东西,遇到了你的问题,只是大声评论。 现在,我并不是说它们将是正确的值,但它们至少应该为零。

【讨论】:

【参考方案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);
   

【讨论】:

我尝试了您列出的方法,我可以可靠地获取 stage.stageWidth 和 stage.StageHeight,但这些值对我来说没有任何意义。我的设备是 480x800 (Galaxy S),但舞台是 500,高度是 375。有什么想法吗? 我也得到了这些值。相反,我会推荐 fullStageWidth 和 fullStageHeight。我刚刚编写了一些可靠地返回值的代码。基本上它使用 stage.orientation 来检查“default”或“upsideDown”。其中任何一个都表示纵向模式,并且 fullStageWidth 和 fullStageHeight 中的值应该没问题。当我找到横向模式时,我会查看高度 > 宽度(如 Capabilities.screenResolutionX/Y 所示)并交换值,只要方向是横向且 h > w。 Kludgy by 已证明 100% 有效,并且不需要您等待超过 ADDED_TO_STAGE。 @Rich 如何获得 fullStageWidth 和 fullStageHeight 的值?

以上是关于确定实际屏幕/舞台分辨率的 Flex 4.5 移动 iOS 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何确定移动应用程序中可以合理呈现多少列? (屏幕尺寸/分辨率/方向)

响应式开发移动端入门必备知识

Flex应用程序中的屏幕分辨率问题

Flex 项目响应问题

移动端适配必须掌握的基本概念和适配方案

移动web开发之屏幕三要素