android获取屏幕尺寸与密度

    遇到一个问题,个人地图浮标图片在WVGA手机上正好,在QVGA上就显的太大,因此我要根据屏幕的不一样调整浮标的大小使其在QVGA大小合适。有的同事提出了依据分辨率来区分不一样的屏幕,可是单WVGA就支持好几种不一样的分辨率,QVGA又支持好几种。。。并且更神奇的时候,有时候,经过代码获取屏幕分辨率居然获得了 320 x 427 ,Android文档是不支持这种分辨率的,因此依据分辨率来区分不一样的屏幕是行不通的。android

    还好经过仔细研读文档,“各类VGA的density是不一样的,(hdpi: 240 , ldpi: 120 , mdpi: 160 , xhdpi: 320)”,因此只要求出不一样屏幕的density,就能够知道该手机属于的屏幕类型。程序员

 

首先是几个基本概念:web

1.屏幕尺寸Screen size布局

即显示屏幕的实际大小,按照屏幕的对角线进行测量。编码

为简单起见,Android把全部的屏幕大小分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).spa

应用程序能够为这四种尺寸分别提供不一样的自定义屏幕布局-平台将根据屏幕实际尺寸选择对应布局进行渲染,这种选择对于程序侧是透明的。3d

2.屏幕长宽比Aspect ratioorm

长宽比是屏幕的物理宽度与物理高度的比例关系。应用程序能够经过使用限定的资源来为指定的长宽比提供屏幕布局资源。xml

3.屏幕分辨率Resolution图片

在屏幕上显示的物理像素总和。须要注意的是:尽管分辨率一般用宽x高表示,但分辨率并不意味着具体的屏幕长宽比。

在Andorid系统中,应用程序不直接使用分辨率。

4.密度Density

根据像素分辨率,在屏幕指定物理宽高范围内能显示的像素数量。

在一样的宽高区域,低密度的显示屏能显示的像素较少,而高密度的显示屏则能显示更多的像素。

屏幕密度很是重要,由于其它条件不变的状况下,一共宽高固定的UI组件(好比一个按钮)在在低密度的显示屏上显得很大, 而在高密度显示屏上看起来就很小。

为简单起见,Android把全部的屏幕分辨率也分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).

应用程序能够为这四种尺寸分别提供不一样的资源-平台将透明的对资源进行缩放以适配指定的屏幕分辨率。


密度无关的像素( DIP ) 
指一个抽象意义上的像素,程序用它来定义界面元素。它做为一个与实际密度无关的单位,帮助程序员构建一个布局方案(界面元素的宽度,高度,位置)。 
一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为 160DPI的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度做为基准,“透明地”处理所 有须要的DIP缩放操做。要把密度无关像素转换为屏幕像素,能够用这样一个简单的公式: pixels = dips * (density / 160)。举个例子,在 DPI为 240的屏幕上, 1个 DIP等于 1.5个物理像素。咱们强烈推荐你用 DIP来定义你程序的界面布局,由于这样能够保证你的 UI在各类分辨率的屏幕上均可以正常显示

 

  在一个Activity的onCreate方法中,写入以下代码:


 
       DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        int width = metric.widthPixels;  // 屏幕宽度(像素)
        int height = metric.heightPixels;  // 屏幕高度(像素)
        float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5)
        int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)


 
   可是,须要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。好比说,一部240x320像素的低密度手机,若是运行上述代码,获取到的屏幕尺寸是320x427。所以,研究以后发现,若没有设定多分辨率支持的话,Android系统会将240x320的低密度(120)尺寸转换为中等密度(160)对应的尺寸,这样的话就大大影响了程序的编码。因此,须要在工程的AndroidManifest.xml文件中,加入supports-screens节点,具体的内容以下:
        <supports-screens
            android:smallScreens="true"
            android:normalScreens="true"
            android:largeScreens="true"
            android:resizeable="true"
            android:anyDensity="true"
/>


 
   这样的话,当前的Android程序就支持了多种分辨率,那么就能够获得正确的物理尺寸了。

 

 

  1. // 获取屏幕密度(方法1)  

  2. int screenWidth  = getWindowManager().getDefaultDisplay().getWidth();       // 屏幕宽(像素,如:480px)  

  3. int screenHeight = getWindowManager().getDefaultDisplay().getHeight();      // 屏幕高(像素,如:800p)  

  4.   

  5. Log.e(TAG + "  getDefaultDisplay""screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  

  6.   

  7.   

  8. // 获取屏幕密度(方法2)  

  9. DisplayMetrics dm = new DisplayMetrics();  

  10. dm = getResources().getDisplayMetrics();  

  11.   

  12. float density  = dm.density;        // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)  

  13. int densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)  

  14. float xdpi = dm.xdpi;             

  15. float ydpi = dm.ydpi;  

  16.   

  17. Log.e(TAG + "  DisplayMetrics""xdpi=" + xdpi + "; ydpi=" + ydpi);  

  18. Log.e(TAG + "  DisplayMetrics""density=" + density + "; densityDPI=" + densityDPI);  

  19.   

  20. screenWidth  = dm.widthPixels;      // 屏幕宽(像素,如:480px)  

  21. screenHeight = dm.heightPixels;     // 屏幕高(像素,如:800px)  

  22.   

  23. Log.e(TAG + "  DisplayMetrics(111)""screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  

  24.   

  25.   

  26.   

  27. // 获取屏幕密度(方法3)  

  28. dm = new DisplayMetrics();  

  29. getWindowManager().getDefaultDisplay().getMetrics(dm);  

  30.   

  31. density  = dm.density;      // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)  

  32. densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)  

  33. xdpi = dm.xdpi;           

  34. ydpi = dm.ydpi;  

  35.   

  36. Log.e(TAG + "  DisplayMetrics""xdpi=" + xdpi + "; ydpi=" + ydpi);  

  37. Log.e(TAG + "  DisplayMetrics""density=" + density + "; densityDPI=" + densityDPI);  

  38.   

  39. int screenWidthDip = dm.widthPixels;        // 屏幕宽(dip,如:320dip)  

  40. int screenHeightDip = dm.heightPixels;      // 屏幕宽(dip,如:533dip)  

  41.   

  42. Log.e(TAG + "  DisplayMetrics(222)""screenWidthDip=" + screenWidthDip + "; screenHeightDip=" + screenHeightDip);  

  43.   

  44. screenWidth  = (int)(dm.widthPixels * density + 0.5f);      // 屏幕宽(px,如:480px)  

  45. screenHeight = (int)(dm.heightPixels * density + 0.5f);     // 屏幕高(px,如:800px)  

  46.   

  47. Log.e(TAG + "  DisplayMetrics(222)""screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  

相关文章
相关标签/搜索