Android dp、px转换关系

http://www.jianshu.com/p/cd66b7e01d4a

/*** 根据手机的分辨率从 dp 的单位 转成为 px(像素)*/

public static int dip2px(Context context,floatdpValue) {finalfloatscale =context.getResources().getDisplayMetrics().density;return(int) (dpValue * scale + 0.5f);

}

/*** 根据手机的分辨率从 px(像素) 的单位 转成为 dp*/

public static int px2dip(Context context,floatpxValue) {finalfloatscale =context.getResources().getDisplayMetrics().density;return(int) (pxValue / scale + 0.5f);

}

我们通常指的手机分辨率是指像素值也就是px的单位。

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 平方厘米)中含有的像素点数量。

Dip / dp (设备独立像素)

也可以叫做dp,长度单位,同一个单位在不同的设备上有不同的显示效果,具体效果根据设备的密度有关,详细的公式请看下面 。

但是实际上程序中使用的dp来适配不同机型从而来转换。

px到dp是需要对当前密度比例的一个缩放即:10px,为10/scale

每个机型分辨率下对应着一个屏幕密度:

密度因子即160所以,当m的分辨率1dp = 1px

m:160    320p

h:240     480p

xh:320    720p

xxh:480    1080p

xxxh:640   1440p 2k

对于分辨路为720*1280 5.5寸:

ro.sf.lcd_density = 320

320/160 = 2

计算方式:720*1280 5.5寸 1280*1280+720*720 = 1648.6047/5.5 = 267.0190(取320)

--------------------------------------------------------------------

对于分辨路为1080*1920 5.5寸::

ro.sf.lcd_density = 320

480/160 = 3:

计算方式:1080*1920 5.5寸 2202.90707/5.5 = 400.5285(取480)

系统会将计算出的DPI转化成(120 160 240 320 480)

+0.5的作用是为了适用于程序中的四舍五入

例如5.6f在java中转换成int类型的话是5,所以加上0.5从而变成6,提高了精度。

你可能感兴趣的:(Android dp、px转换关系)