赞
踩
Px (Pixel像素)
也称为图像元素,是作为图像构成的基本单元,单个像素的大小并不固定,跟随屏幕大小和像素数量的关系变化(屏幕越大,像素越低,单个像素越大,反之亦然)。所以在使用像素作为设计单位时,在不同的设备上可能会有缩放或拉伸的情况。
Resolution(分辨率)
是指屏幕的垂直和水平方向的像素数量,如果分辨率是 1920*1080 ,那就是垂直方向有 1920 个像素,水平方向有 1080 个像素。
Dpi(像素密度)
是指屏幕上每英寸(1英寸 = 2.54 厘米)有多少个像素点。如果屏幕为 320*240,屏幕长 2 英寸宽 1.5 英寸,Dpi = 320 / 2 = 240 / 1.5 = 160。
Density(密度)
这个是指屏幕上每平方英寸(2.54 ^ 2 平方厘米)中含有的像素点数量。也就是dpi的平方
Dip / dp (设备独立像素)
也可以叫做dp,长度单位,同一个单位在不同的设备上有不同的显示效果,具体效果根据设备的密度有关,详细的公式请看下面 。
我们以一个 4.95 英寸 1920 * 1080 的 nexus5 手机设备为例:
应该为: 445^2=198025。
上面计算的 445Dpi 是在 4.95 英寸下的 1920*1080 手机,那如果是 4.75 分辨率下的呢? 4.55 分辨率下的呢?。。。。可见是很麻烦的,同一个分辨率在不同的屏幕尺寸上 Dpi 也不相同。为了解决这个问题, Android 中内置了几个默认的 Dpi ,在特定的分辨率下自动调用,也可以手动在配置文件中修改。
ldpi | mdpi | hdpi | xhdpi | xxhdpi | |
---|---|---|---|---|---|
分辨率 | 240x320 | 320x480 | 480x800 | 720x1280 | 1080x1920 |
系统dpi | 120 | 160 | 240 | 320 | 480 |
基准比例 | 0.75 | 1 | 1.5 | 2 | 3 |
找到我们手机中的 /system/build.prop 文件,其中有一行是这样:
ro.sf.lcd_density=480
这就指定了这个机型使用的dpi是多少,还有一种情况是没有这一行(我在模拟器中发现过),那么应该是根据表格中的分辨率来自动设置。
说到底,因为有dpi这个动态的系数,我们在使用dp的时候才能兼容不同分辨率的设备。
到这里,应该都明白了 dpi 的由来,以及系统 dpi 跟物理 dpi 并不一定相同。在系统中使用的全部都是系统 dpi,没有使用物理 dpi,也获取不到物理 dpi。物理 dpi 主要用于厂家对于手机的参数描述(也可以看做 ppi )!
160是基准。
其中的480/160其实就是在求基准比例,这里得到3。:
分辨率:1080x1920 -> 系统 DPI:480 -> 基准比例:480 / 160 = 3 -> 对应px:100 x 3 = 300
分辨率:720x1280 -> 系统 DPI:320 -> 基准比例:320 / 160 = 2 -> 对应px:100 x 2 = 200
分辨率:480x800 -> 系统 DPI:240 -> 基准比例:240 / 160 = 1.5 -> 对应px:100 x 1.5 = 150
分辨率:320x480 -> 系统 DPI:160 -> 基准比例:160 / 160 = 1 -> 对应px:100 x 1 = 100
分辨率:240x320 -> 系统 DPI:120 -> 基准比例:120 / 160 = 0.75 -> 对应px:100 x 0.75 = 75
...................
1. dpi(每英寸像素数)是有预设值的!120-160-240-320-480。对应不同的分辨率。
2. 基准比例 = dpi(每英寸像素数) / 160
3. px = dp x 基准比例
实际运用如下:
- DisplayMetrics dm = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(dm);
- //通常我们在使用DisplayMetrics时,都是直接获取内部变量来使用。所以下面直接列出各个内部变量。
-
- dm.ydpi; //得到物理屏幕上 Y 轴方向每英寸的像素
- dm.xdpi; //得到物理屏幕上 X 轴方向每英寸的像素
- //ps: 其实这两个大多数情况下都是相同的
- //你能想象上面像素密度大很清晰 下面密度小跟马赛克一样吗 233333
-
- dm.density; //获取当前设备的基准比例
- dm.densityDpi; //获取系统dpi,随着 build.prop 文件中的代码而改变。
-
- dm.widthPixels; //获取屏幕宽度的像素数量
-
- //获取屏幕高度的像素数量!
- //注意 - 因为这里会自动减去32dp的像素数量,根据分辨率不同的设备,减去的像素数量也不同,但是可以根据公式推算完整(px = dp x 基准比例)。
- /*为啥不用dm.densityDpi / 160 得到基准比例?
- 因为那个会随着build.prop文件代码变更而更改,算出来的不一定准确*/
- dm.heightPixels + 32 * dm.ydpi / 160;

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。