您的位置:首页 > 移动开发 > Android开发

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

2016-10-13 12:09 453 查看
手机的尺寸: 屏幕对角线的长度,单位为英寸(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)
ldpi120dpi0.75
mdpi160dpi1.0
hdpi240dpi1.5
xhdpi320dpi2.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 = y*x 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 像素