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,提高了精度。
网友评论