Android——DisplayMetrics之我见

一、起因

为了适应多屏幕分辨率,可以在res目录下建立不同的layout文件,例如想适应C8500(320*240)和Milestone(854*480),可以在res目录下建立layout-320*240和layout-854*480两个目录,然后在其中定义不同的布局文件就可以了;但在实际中并没有凑效;这是为什么呢;

在真机下调试才发现有问题,Android有个类DisplayMetrics可以得到分辨率等信息,方法如下:

DisplayMetrics metrics;getWindowManager().getDefaultDisplay().getMetrics(metrics);

metrics.widthPixels           屏幕宽

metrics.heightPixels          屏幕高

metrics.density                  屏幕密度

其它用不到的属性就不写了,调试中发现C8500得到的是427*320,而而Milestone得到是569*320;这是为什么呢?难道是Android API有问题?

二、探索

实际上是自己对Android多屏幕分辨率理解不深刻,那么问题出在哪儿呢?这里需要用到一个公式pixels = dps * (density / 160),在SDK中有提到,需要说明一点公式中的density与metrics.density不是一个东西,它们的关系是:metrics.density = density / 160,density的值有120、160、240、320(这在SDK中也有说明);好了直接套用公式就OK了C8500实际分辨率为320*240,密度(也就是metrics.density的值)为0.75,用公式算出来正好是427*320;Milestone实际分辨率是854*480,密度是1.5,算出来是569*320(有四舍五入的);

好吧,按照以上的结论直接在res目录下建立layout-427*320和layout-569*320;分别编写不同的布局文件,OK!问题解决,终于可以适应两个手机屏幕了。

三、没有结束……

真的就这么搞定了吗?似乎没有,把AndroidManifest.xml中android:minSdkVersion=”3″(一直都是3),中3改为4,问题又来了,界面又乱了,在两个手机都乱了;怎么回事呢?再调试,我那个晕,C8500手机屏幕分辨率又变了,变回320*240,套用上面的公式反而又错了,程序又找不到布局文件了,界面自然就乱了,这是WHY   WHY   WHY????

别着急,再来看看问题出在哪儿。查找SDK,加上自己对Android多分辨率的支持的理解,真正的原因应该是当android:minSdkVersion=”3″时也就是此时支持android1.5,在 Android 1.5以及更早的版本中,只支持3.2″ 屏幕上的HVGA (320×480)分辨率,开发人员也不需要考虑界面的适配性问题。从Android 1.6之后,平台支持多种尺寸和分辨率的设备,这也就意味着开发人员在设计时要考虑到屏幕的多样性。

由此可见,在android:minSdkVersion=”3″时,还没有多分辨率的概念,因而此时,DisplayMetrics得到的宽和高是与密度相关的,也就是说此时得到的宽和高都是以dp或dip为单位的,要转换成px才是我们通常据说的分辨率。自android1.6及以后,DisplayMetrics得到的宽和高都是以px为单位的,不需要转换。

总结一下:android的兼容性意味着应用程序api的降级。api的降级意味着在高端机(版本高配置高)上的显示效果配不上


-------- 遇见的问题

获取手机分辨率的代码:


DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); tv.setText("屏幕分辨率为:"+dm.widthPixels+" * "+dm.heightPixels);



很简单,但是有些高分辨率的手机获取的不正常,比如使用Moto Milestone手机,这款手机是480x854分辨率的,但使用DisplayMetrics.widthPixels得的结果是320x533,并且如果按480x854切图也显示的太大,按320x533切图显示正常。原因是你没有在AndroidManifest.xml文件中设置参数android:minSdkVersion ,android在1.6之前是不支持WVGA个FWVGA的。


在AndroidManifest.xml加上下边的代码就ok了


你可能感兴趣的:(Android——DisplayMetrics之我见)