现在的位置: 首页 > 综合 > 正文

真的获取到了屏幕尺寸的实际像素值吗

2017年08月04日 ⁄ 综合 ⁄ 共 1358字 ⁄ 字号 评论关闭

在Android应用开发过程中,我们常常需要获取到屏幕尺寸的像素值。到此,很多人会说:So,easy!好吧,之前我也是这么认为滴。因为DisplayMetric类文档开头就有这么一段:


刚刚无意中看了下getMetrics的文档描述:



额,,,我也不晓得自己之前是怎么混过来的。

针对这个问题google了一下,有几篇博客里提到了这个问题。大概看了几篇描述,所有对这个问题的描述都是一模一样,都是转载过来的。而被转载的是CSDN网名叫“luohai859”的一篇博客。对这个问题的原文描述如下贴图:

按照上面的方法试了一下,果然能获取到屏幕实际的像素尺寸(针对三星i9300,添加supports-screens设置之前获取到的分辨率是569x320,density是1.0;添加supports-screens设置之后获取到的分辨率是1280x720,density是2.0)。针对设置的这些screens属性,查了下文档(原文:http://developer.android.com/guide/topics/manifest/supports-screens-element.html),有以下几点需要注意:

1、resizeable设置在这里有点多余

andorid引入这个属性只是为了帮助应用从android 1.5过渡到1.6,已经被废弃。

2、anyDensity不能禁用

这个属性指明应用程序是否包含了能够适用于任何屏幕密度的资源。文档上说这个属性值默认是true,那是不是可以不设置呢?

实践表明,如果这里把anyDensity设置去掉得到的是转换后的值。我这里测试手机是三星i9300,官方给出的屏幕分辨率是1280x720,其density是2.0。去掉anyDensity后得到的屏幕分辨率是640x360density是1.0。

3、其他几个屏幕特性

这里需要注意的是,largeScreens和xlargeScreens属性的默认值实际上在某些版本之间是不同的,因此最好在任何时候都明确的声明这个属性。如果设置为false,系统会启用屏幕兼容模式(关于屏幕兼容模式,文档里面有详细的介绍:http://developer.android.com/guide/practices/screen-compat-mode.html)。

到此,有没有觉得被google坑的感觉(传说中的坑爹)。不就是要取一个屏幕实际参数么,有必要搞这么麻烦么。。。估计是google也觉得麻烦,所以API 17开始提供了一个getRealMetrics方法,看方法名就知道是我们想要的。

从文档的第一句描述来看,确实是返回实际的size。在我的三星i9300上验证,获取Metrics确实是实际值。接着方法描述往下看,第二句说“获得的size是基于当前显示rotation调整过的”。我的理解是,当屏幕旋转时,宽高值会对换。比如说,我的三星i9300是1280x720。当横屏时获取的width是1280,height是720;当竖屏时这两个值刚好对换过来。第三句说“当窗口管理器效仿一个更小的display时,获得的真实的size可能会比屏幕的物理size小”。好吧,这个我还真没太理解啥意思。看来这个问题还没完啊,等待后续验证。。。


抱歉!评论已关闭.