手机的尺寸: 屏幕对角线的长度,单位为英寸(2.54cm)
手机的分辨率: 屏幕能显示的像素的数量, 一般用在长方向上数量*宽方向上数量来表达
手机的像素密度: pixels per inch,也称PPi,即每英寸屏幕能显示的像素数,像素密度越大,显示画面细节就越丰富。�计算:像素密度={1+√[(长度像素数-1)2+(宽度像素数-1)2]}/屏幕尺寸
DPI: Dots Per Inch(每英寸所打印的点数或线数)的缩写,用来表示打印机打印分辨率, 但有时也会用dpi来代指ppi
手机的密度: Density, 以160dpi为基准,手机的像素密度与基准的比值。 即像素密度为160时Density为1
常用dpi标识(字母) | 常用dpi标识(数字) | 手机密度(density) |
---|---|---|
ldpi | 120dpi | 0.75 |
mdpi | 160dpi | 1.0 |
hdpi | 240dpi | 1.5 |
xhdpi | 320dpi | 2.0 |
px: pixels(像素) ,1px就是屏幕上一个物理像素点的大小(长度)。
dp/dip: device-independent pixels(设备无关像素),一个基于density的抽象单位,如果一个160dpi的屏幕(手机密度为1的话),1dp=1px
定义:1dp = (dpi / 160) px
也就是1px = 1/density dp
即:1dp = density px
- 160dpi:1dp = 1px
- 120dpi:1dp = 0.75px
- 320dpi:1dp = 2px
dp值转换为px值得方法为:
假设手机密度 :density = x,dp的值为y
由1dp = density px
可知ydp = yx px
所以结果为yx
px值转换为dp值得方法为:
假设手机密度 :density = x,px的值为y
由1px = 1/density dp
可知 ypx = y/x dp
所以结果为y/x
因此有了如下方法:
public static int dip2px(Context context, float dipValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(dipValue * scale + 0.5f); } public static int px2dip(Context context, float pxValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(pxValue / scale + 0.5f); }
至于为什么要加0.5f?
因为在java中,强制转换符把float转换为int时,是直接丢掉小数部分的,加0.5f起到了四舍五入的作用,可以减小误差。
网友评论