Layout Capabilities.screenDPI:在模拟器上正确,在设备上错误

Layout Capabilities.screenDPI:在模拟器上正确,在设备上错误,layout,actionscript,flex-mobile,multiscreen,Layout,Actionscript,Flex Mobile,Multiscreen,我正在制作我的应用程序多屏幕(flex mobile)。基本上,我想知道我是在用平板电脑还是智能手机。因此,我想知道屏幕大小的英寸。我正在Desire HD(4.3英寸)上进行测试。我的问题是:当我使用Capabilities.screenDPI时,模拟器会显示正确的值(217),但是当我在设备上运行时,它会给我一个错误的DPI值(240),宽度和高度都是正确的。基于这个dpi,我得到了一个错误的屏幕尺寸(3.887英寸)!=4.3英寸)。同样,在模拟器上,一切运行正常。设备模拟器配置了正确的值

我正在制作我的应用程序多屏幕(flex mobile)。基本上,我想知道我是在用平板电脑还是智能手机。因此,我想知道屏幕大小的英寸。我正在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值可以“互换”使用。(). 我没有发现dpi值与ppi值不同的任何信息,或者在flex中使用ppi属性的任何可能性

因此,在我的真实设备上,我得到:

480 x 800像素,3.89英寸(约240 dpi)

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


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

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

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

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

我很惊讶这在emulator中能起作用,在emulator中,我希望返回的值是来自计算机显示器的值,而不是智能手机应该返回的值。

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

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

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


我很惊讶这在emulator中能起作用,在emulator中,我希望返回的值是来自计算机显示器的值,而不是智能手机应该返回的值

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%准确,a还没有在2台设备上进行测试,只是尝试使用不同的设备,看看在大多数情况下是否能猜出设备的类型

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%准确,a尚未在2台设备上进行测试,只需尝试使用不同的设备,看看在大多数情况下是否猜测设备类型即可

要在emulator模式下检测屏幕大小,可以通过以下方式使用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;

要在emulator模式下检测屏幕大小,可以通过以下方式使用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;

我知道这是一个旧线程,但我想你们会想知道我是如何处理它-我终于有它固定在我的一端

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上使用emulator时,系统总是认为im处于平板电脑模式(因为它会为我的显示器的屏幕X和屏幕Y值返回非常大的值)。因此,我使用isDesktop标志来处理


然后,我使用屏幕大小值给我提供平板电脑与手机的对比。目前(2013年2月)没有屏幕大小小于6的平板电脑,上面也没有手机。

我知道这是一条老线索,但我想你们会想知道我是如何处理的-我终于把它修好了

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上使用emulator时,系统总是认为im处于平板电脑模式(因为它会为我的显示器的屏幕X和屏幕Y值返回非常大的值)。因此,我使用isDesktop标志来处理


然后,我使用屏幕大小值给出tablet vs phone。目前(2013年2月)没有屏幕大小小于6的平板电脑,上面也没有手机。

谢谢您的回答。由于Flash Builder中指定了不同的设备(手机和平板电脑),模拟器显示了正确的值,每个都有一个宽x高和一个DPI。令我惊讶的是,模拟器显示了正确的DPI值,结果