Capabilities.screenDPI:在模拟器上更正,在设备上出错

时间:2012-06-03 19:39:22

标签: layout actionscript flex-mobile multiscreen

我正在制作我的应用程序多屏幕(灵活移动)。基本上我想知道我什么时候处理平板电脑或智能手机。因此我想知道屏幕尺寸以英寸为单位。我正在Desire HD(4.3英寸)上测试它。我的问题是:当我使用Capabilities.screenDPI时,模拟器显示正确的值(217),但是当我在我的设备上运行它时,它给我一个错误的DPI值(240),宽度和高度是正确的。基于该dpi我得到一个错误的屏幕尺寸(英寸为3.887“!= 4.3”)。再次在模拟器上一切正常。设备仿真器配置了正确的值,只有当我在真实设备上运行它(没有仿真器)时,我的DPI值才会错误。

我正在使用以下代码计算它:

var screenX:Number = stage.stageWidth;
var screenY:Number = stage.stageHeight;
var pixels:Number = (screenX*screenX) + (screenY*screenY);
var screenSize:Number = Math.sqrt(pixels)/Capabilities.screenDPI;

return (screenSize >= 6) ? "tablet" : "phone" 

为了省时间,我会给出Desire HD的价值:

  

480 x 800像素,4.3英寸(~217 ppi像素密度)

使用的公式是简单的〜毕达哥拉斯:a2 + b2 = c2 - > sqrt(c)/ dpi =屏幕尺寸(英寸)。

基于Adobe,DPI或PPI值可以“互换”使用。 (Adobe, Help)。我没有找到任何信息,其中dpi值不同于ppi值,或者在flex中有可能使用ppi属性。

所以在我的真实设备上我得到了:

  

480 x 800像素,3.89“(~240 dpi)。

另一个注意事项: 我已经看到flex mobile中有3个默认常量。可能是它直接投入其中一个? (我不怀疑,因为我直接调用了Capabilities.screenDPI。)

DPIClassification.DPI_160
DPIClassification.DPI_240
DPIClassification.DPI_320

我的意思是:如何确定它是平板电脑还是手机(为了切换到另一种布局)?您无法遵循applicationDPI道路,因为它与三星Galaxy S3(1280x720,319 PPI)或Apple iPad 3(2048×1536,264 PPI)等新设备混在一起。

4 个答案:

答案 0 :(得分:4)

要在模拟器模式下检测屏幕大小,您可以这样使用SystemManager对象:

var root:DisplayObject = SystemManager.getSWFRoot(this); // this is any object of the application not only display object
screenX = root.stage.fullScreenWidth;
screenY = root.stage.fullScreenHeight;

答案 1 :(得分:1)

我知道这是一个老线程,但我认为你们想知道我是如何处理它的 - 我终于把它固定在我的最后。

protected function resizeHandler(event:ResizeEvent):void
            {
                var screenX:Number = Capabilities.screenResolutionX;
                var screenY:Number = Capabilities.screenResolutionY;
                var osType:String = Capabilities.os;
                var limitNumber:Number = 960;
                var pixelCheck:Number = screenX * screenY;
                var pixels:Number = (screenX*screenX) + (screenY*screenY);
                var screenSize:Number = Math.sqrt(pixels)/Capabilities.screenDPI;

                isPortrait = height > width;
                //isTablet = screenX > limitNumber || screenY > limitNumber;
                isTablet = screenSize >= 6;
                var isDesktop:Boolean = height > limitNumber || width > limitNumber;

                if (osType.toUpperCase() == "WINDOWS 7"){
                    this.currentState = (isPortrait ? "portrait" : "landscape") + (isDesktop ? "Tablet" : "Phone");
                }else {
                    this.currentState = (isPortrait ? "portrait" : "landscape") + (isTablet ? "Tablet" : "Phone");
                }

                //DEBUGGING CODE BELOW


                debugger.text = "screen X: " + screenX.toString() + " screen Y: " + screenY.toString() + "\n pixels: " + pixels.toString() + "\n screenSize: " + screenSize.toString() + "\n capabilities.screenDPI: " + Capabilities.screenDPI.toString() + "\n current state: " + this.currentState + /*"\n IsDesktop: " + isDesktop.toString() + */ " IsTablet: " + isTablet.toString() + "\n OS Type" + osType;

                //currentState = (isPortrait ? "portrait" : "landscape") + (isTablet ? "Tablet" : "Phone");

            }

从上面的代码中可以看出,我正在处理两种不同的情况。 1 - 当我在我的本地PC上使用模拟器时,系统总是认为我是平板电脑模式(因为它为我的显示器的屏幕X和屏幕Y值返回非常大的值)。所以我使用isDesktop标志处理它。

然后,我使用屏幕尺寸值给我平板电脑和手机。目前(2013年2月)屏幕尺寸没有6以下的平板电脑,上面没有手机。

答案 2 :(得分:0)

Flex applicationDPI属性将返回160(对于大多数平板电脑),240(对于大多数智能手机)和320对于iPhone 4 / 4S。

这是在引擎盖下发生的事情,让开发人员的生活“更轻松”。为设备的特定DPI构建的任何内容可能无法扩展到其他设备/平台。我认为applicationDPI成为这三个值中的一个是Flex的东西,但Flex完全可以从AIR继承它。

在一天结束时,我认为您无法使用DPI值来确定您的应用是在平板电脑还是手机上运行。因为我在上面指定的值不是通用的。这都是一个猜谜游戏。

我很惊讶这在模拟器中是可行的,在那里我希望返回的值是来自计算机显示器的值,而不是智能手机的值。

答案 3 :(得分:0)

您可以尝试类似

的内容
var isItATablet:Boolean = screenHeight > 960 || screenWidth > 960;
var isItReallyATablet:Boolean = isTablet && screenDPI >= 240; // I think this doesn't work as is, but you get the idea..

通过这种方式,如果屏幕高度或宽度大于960px且DPI很低,您可能会在平板电脑上使用。

这不是100%准确,没有经过测试,但在2台设备上,只需尝试使用不同的设备,看看是否在大多数情况下猜测设备类型