我的手机为 :华为 p8青春版 1280* 720 5 英寸 dpi 293
dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算
1. 基本概念
- dip : Density independent pixels ,设备无关像素。
- dp :就是dip
- px : 像素
dpi :dots per inch , 指每英寸上的像素点数。常见取值 120,160,240。我一般称作像素密度,简称密度
density : 直接翻译的话貌似叫 密度。常见取值 1.5 , 1.0 。和标准dpi的比例(160px/inc)
- 屏幕分辨率 : 横纵向上的像素点数,单位是px,1px=1像素点,常见取值 480X800 ,320X480,1280*720
- 屏幕尺寸: 屏幕对角线的长度。电脑电视同理。==单位是英寸,1英寸=2.54厘米==
屏幕比例的问题。因为只确定了对角线长,2边长度还不一定。所以有了4:3、16:9这种,这样就可以算出屏幕边长了。
sp:Scale-Independent Pixels的缩写,可以根据文字大小首选项自动进行缩放。Google推荐我们使用12sp以上的大小,通常可以使用12sp,14sp,18sp,22sp,最好不要使用奇数和小数。
- 应用
density 与 densityDpi 区别
- 应用
metrics.density;
metrics.densityDpi;
densityDpi : 就是我们常说的dpi。
density : 其实是 DPI / (160像素/英寸) 后得到的值。
dpi的单位是 像素/英寸,比较符合物理上面的密度定义,密度不都是单位度量的值么,所以我更喜欢把dpi叫像素密度,简称密度,density还是就叫density。
- 各单位间转换
3.1 计算dpi
3.2 计算 dp 与 px
我们写布局的时候,肯定还是要知道1个dp到底有多少px的。
换算公式如下: dp = (DPI/(160像素/英寸))px = density px
注意,这里都是带单位的。px是单位,dp是单位,density没单位。
为了方便,假设dpi是240 像素/英寸 , 那么density就是1.5
那么就是 dp=1.5px ,注意这是带了单位的,也就是 设备无关像素 = density 像素
那么转换为数值计算的话,应该是下面这个式子
//1DP等于多少像素 PX
PX = density * DP
也就是
像素值 = density * 设备无关像素值 ,请注意这里有个值字。
3.3 dpi
为啥 标准dpi = 160
(1)Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi
实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 dpi 之间的比例即 2:1.5:1:0.75 来给界面中的元素来进行尺寸定义。
也就是说如果以 160 dpi 作为基准的话,只要尺寸的 DP 是 4 的公倍数,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 即可满足所有尺寸下都是整数 pixel 。
但假设以 240 dpi 作为标准,那需要 DP 是 3 的公倍数,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2
而以 LDPI 和 XHDPI 为基准就更复杂了,所以选择 160 dpi
(2)这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。
特定机型的density是确定的,其取值取决于dpi,
如果 dpi == 160, 则density = 1;
如果 dpi == 120, 则density = 0.75;
如果 dpi = 320, 则density = 2;
依次类推,也就是说
density = (dpi*1.0)/ 160;
- dip
dip 的取值和 dpi 有关,如果 为
dpi=160 density =1 1dp=1px
dpi=320 density =2 1dp=2px
dip (dp): device independent pixel。dp
(dip)是最常用也是最难理解的尺寸单位。与像素密度密切
相关。Android系统定义了四种像素密度:低(120dpi)
、中(160dpi)、高(240dpi)和超高(320dpi),它
们对应的dp到px的系数分别为0.75、1、1.5和2,这个系
数乘以dp长度就是像素数。例如界面上有一个长度为
“80dp”的图片,那么它在240dpi的手机上实际显示为
80x1.5=120px,在320dpi的手机上实际显示为
80x2=160px。如果你拿这两部手机放在一起对比,会发
现这个图片的物理尺寸“差不多”,这就是使用dp作为单
位的效果。
屏幕大小和密度对照表
屏幕 宽度 高度 尺寸 大小 密度
Type (Pixels) (Pixels) Range (inches) Size Group
QVGA 240 320 2.6 - 3.0 Small Low
WQVGA 240 400 3.2 - 3.5 Normal Low
FWQVGA 240 432 3.5 - 3.8 Normal Low
HVGA 320 480 3.0 - 3.5 Normal Medium
WVGA 480 800 3.3 - 4.0 Normal High
FWVGA 480 854 3.5 - 4.0 Normal High
WVGA 480 800 4.8 - 5.5 Large Medium
FWVGA 480 854 5.0 - 5.8 Large Medium
6. px 与 dx 转换
1、px :是屏幕的像素点
2、dp :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1pxdip
3、转换方式如下
public class DensityUtil {
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}