文档章节

android获取屏幕尺寸与密度

rainy86
 rainy86
发布于 2014/07/09 23:06
字数 1494
阅读 1036
收藏 18

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

    还好通过仔细研读文档,“各种VGA的density是不同的,(hdpi: 240 , ldpi: 120 , mdpi: 160 , xhdpi: 320)”,所以只要求出不同屏幕的density,就可以知道该手机属于的屏幕类型。

 

首先是几个基本概念:

1.屏幕尺寸Screen size

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

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

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

2.屏幕长宽比Aspect ratio

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

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);  


本文转载自:http://www.cnblogs.com/renyuan/archive/2012/07/25/2607936.html

rainy86
粉丝 2
博文 15
码字总数 37
作品 0
咸阳
程序员
私信 提问
Android 屏幕自适应问题

Android9 patch 图片 (.9.png 格式图片) 的特点和制作 一.9.png格式的文件的特点 与传统的png 格式图片相比, 9.png 格式图片在图片四周有一圈一个像素点组成的边沿,该边沿用于对图片的可扩...

ljrapple
2015/03/02
49
0
Android-支持多屏幕-1

原文链接:Supporting Multiple Screens Android运行在许多不同屏幕尺寸(screen size)和密度(screen density)的设备上。对于应用程序,Android系统提供了一致的跨设备开发环境,处理了应用程...

叶大侠
2014/08/24
1K
0
android系统如何自适应屏幕大小

1、屏幕相关概念 1.1分辨率 是指屏幕上有横竖各有多少个像素 1.2屏幕尺寸 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 android将屏幕大小分为四个级别(small...

mfcai
2013/01/27
648
0
【初印象】Android手机屏幕适配API:nodpi,xhdpi,hdpi,mdpi,ldpi

Android的碎片化设备状况,使得其API必须在不同的屏幕中选取合适的算法并展示,而在API级别上,的确也是有类似的定义,当然,我也终于明白,这是Android的显示效果始终跟不上苹果的原因 苹果...

RankoWong
2013/03/20
3.4K
0
Android初级第九讲之适配和调试

本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Android适配需要考虑方方面面,主要是图片字体大小和API,但也要考虑其他场景下的一些问题。 先熟悉一下Android设备的dpi...

liuzxgeek
2016/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Docker下使用disconf:细说demo开发

Docker下的disconf实战全文链接 《Docker搭建disconf环境,三部曲之一:极速搭建disconf》; 《Docker搭建disconf环境,三部曲之二:本地快速构建disconf镜像》; 《Docker搭建disconf环境,...

程序员欣宸
28分钟前
6
0
centos7配置nfs共享存储服务

nfs 是一种网络文件系统,需要依赖rpc进行过程调度 注意nfs只验证id,验证用户名,并且只能在类unix os上进行文件共享服务,由于它的脆弱的验证机制,所以不适宜在internet上工作,在内网使用...

老孟的Linux私房菜
31分钟前
6
0
【F5小常识】F5的 Web 应用防火墙 (WAF)有什么优势?

     现如今传统防火墙已无法满足企业安全需求,网络攻击大多发生在应用层和网络层故障,且呈上升趋势,传统的防火墙存在着很大的不足之处,包括无法检测加密的Web流量、无法扩展深度检测...

梅丽莎好
42分钟前
4
0
整合到 Mockito 2

为了能够持续改进 Mockito 和在未来提升测试体验,我们希望你能够升级到 Mockito 2.10!Mockito 按照语义化版本(semantic versioning)的方式对版本进行编排,并且只在主版本升级的时候包含...

honeymoose
42分钟前
4
0
spring boot actuator

actuator 是监控系统健康的工具,引入 spring-boot-starter-actuator会暴露一些endpoint. 可通过如下配置来配置这些endpoint的基本配置: 可通过http:${url}:28081/management/actuator/*来访...

ZH-JSON
49分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部