辨析Android中的dp、px之间的关系及一些概念

手机的尺寸: 屏幕对角线的长度,单位为英寸(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
所以结果为y
x

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起到了四舍五入的作用,可以减小误差。

你可能感兴趣的:(辨析Android中的dp、px之间的关系及一些概念)