android densityDpi

QVGA   240*320    120(屏幕密度)

HVGA  320*480    160(屏幕密度)

WVGA 480*800     240(屏幕密度)

px = dp * (dpi / 160)

分辨率是硬件相关,是不可能变的,

另外 一个设备的分辨率是不可以调的,但是屏幕密度是可以调整的,修改system/buil.prop的lcd_desity可以修改dpi的值。

但是如果私自随便改变设备的屏幕密度会导致 dp 不能起到兼容的作用了。


系统是通过   手机实际分辨率 除以  屏幕密度  再乘以一个 固定值 来确定在构建视图的时候选择哪一个文件夹下(hdpi  mdpi  xdpi)的资源文件的。




PhoneWindowManager.java    base on the short Pixel to choose the  Layout and Drawable Folder , such as  sw-600dp  layout folder.     

 如果一个button的宽度是480dp,在QVGA上是 240px ,HVGA320px, WVGA 480px,都是满屏。

       移动设备有大有小,那么如何适应不同屏幕呢,这给我们编程人员造成了很多困惑。我也是突然想到这些问题,然后去网上搜搜相关东西,整理如下。 首先,对下面这些长度单位必须了解。Android中的长度单位详解(dp、sp、px、in、pt、mm)      看到有很多网友不太理解dp、sp和px的区别:现在这里介绍一下dp和sp。dp也就是dip。这个和sp基本类似。如果设置表示长度、高度等属性时可以使用dp 或sp。但如果设置字体,需要使用sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。如果屏幕密度为160,这时dp和sp和px是一 样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。那么原来TextView的宽度 设成160px,在密度为320的3.2寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动 将width属性值设置成320px的。也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换。下面看一下其他单位的含义px:(pixels)(像素):屏幕上的点,与密度相关。密度大了,单位面积上的px会比较多。表示屏幕实际的象素。例如,320*480的屏幕在横向有320个象素,在纵向有480个象素。dip或dp(与密度无关的像素)。这个和设备硬件有关,为了支持WVGA、HVGA和QVGA 5进制空间推荐使用这个。一种基于屏幕密度的抽象单位。设置一些view的宽高可以用这个,一般情况下,在不同分辨率,都不会有缩放的感觉。如果用px的话,320px占满HVGA的宽度,到WVGA上就只能占一半不到的屏幕了,那一定不是你想要的。

sp(与刻度无关的像素)放大像素– 主要处理字体的大小。
in:表示英寸,是屏幕的物理尺寸。每英寸等于2.54厘米。例如,形容手机屏幕大小,经常说,3.2(英)寸、3.5(英)寸、4(英)寸就是指这个单位。这些尺寸是屏幕的对角线长度。如果手机的屏幕是3.2英寸,表示手机的屏幕(可视区域)对角线长度是3.2*2.54 = 8.128厘米。读者可以去量一量自己的手机屏幕,看和实际的尺寸是否一致。
mm:表示毫米,是屏幕的物理尺寸。
pt:表示一个点,是屏幕的一个物理长度,大小为1英寸的1/72。换算公式:px = (density/160)dp
density一般为3个常用固定值240/160/120
分别对应WVGA/HVGA/QVGA
不知道知己做的分辨率对应的density是多少可以点击AVD Manager里新建一个模拟器或者选择已有的模拟器点details就可以看到了(1.6以上包括1.6才可以查)
补充:dp跟dip是一样的,但px跟dp(dip)绝对不一样,唯一的情况只有在HVGA分辨率下才是一样,因为HVGA分辨率对应density为160,与除数一样,所以做的时候才会没感觉到差别 其次,我们在创建一个模拟器的时候,有一个选项是选择模拟器的大小,其实就是选择模拟器的屏幕大小,就是我们常说的分辨率。比如:320*48等。Density的意思是“密度”。密度,就是说单位面积内的容量大小。 HVGA屏density=160
QVGA屏density=120
WVGA屏density=240
WQVGA屏density=120 density值表示每英寸有多少个显示点,与分辨率是两个概念。 不同density下屏幕分辨率信息:480*800的WVGA(density=240)
density=120时 屏幕实际分辨率为240*400 (两个点对应一个分辨率)



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)


android 从3.2 版本以上,就该了资源适配的方法了,例:values-sw360dp,而不再建议使用values-960X540。
values-sw360dp 含义: sw 的全称:smallestwidth,可以理解为最小宽度。比如我们8825,分辨率960x540,
它的最小宽度是540px,根据目前的density值240,所以转换为dp值应该是360dp.

资源的遍历规则,同时存在values-sw360dp定义和values-960X540定义情况下,会查找values-sw360dp下面 的。而且
目前测试发现只要定义了values-swxxxdp值,只要存在这个“xxx”值小于等于360dp的sw定义,就不会采用values- 960X540。




你可能感兴趣的:(android densityDpi)