我正在制作我的应用程序多屏幕(灵活移动)。基本上我想知道我什么时候处理平板电脑或智能手机。因此我想知道屏幕尺寸以英寸为单位。我正在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)等新设备混在一起。
答案 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台设备上,只需尝试使用不同的设备,看看是否在大多数情况下猜测设备类型