1

我正在制作我的应用程序多屏(flex 移动)。基本上我想知道我什么时候使用平板电脑或智能手机。因此我想知道以英寸为单位的屏幕尺寸。我在 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 = 以英寸为单位的屏幕尺寸。

基于 Adob​​e,DPI 或 PPI 值可以“互换”使用。(Adobe,帮助)。我没有找到任何关于 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

4 回答 4

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;
于 2012-11-23T08:55:08.127 回答
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 的平板电脑,也没有高于它的手机。

于 2013-02-26T14:00:13.460 回答
0

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

这是为了让开发人员的生活“更轻松”而发生的事情。为设备的特定 DPI 构建的任何东西都可能无法很好地扩展到其他设备/平台。我认为这三个值之一的 applicationDPI 是 Fl​​ex 的事情,但 Flex 完全有可能只是从 AIR 继承它。

归根结底,我认为没有任何方法可以使用 DPI 值来确定您的应用程序是在平板电脑还是手机上运行。因为我上面指定的值不是通用的。这有点像猜谜游戏。

我很惊讶这在模拟器中完全有效,我希望返回的值是来自您的计算机显示器的值,而不是智能手机应该是的值。

于 2012-06-03T20:08:41.500 回答
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..

如果屏幕高度或宽度大于 960 像素并且 DPI 较低,则可能您使用的是平板电脑。

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

于 2012-10-31T21:03:17.933 回答