用户工具

站点工具


开发:android:长度单位

基本概念

  • px(Pixels,像素):对应屏幕上的实际像素点。
  • in(Inches,英寸):屏幕物理长度单位。
  • mm(Millimeters,毫米):屏幕物理长度单位。
  • pt(Points,磅):屏幕物理长度单位,1/72英寸。
  • dp(与密度无关的像素):逻辑长度单位,在 160 dpi 屏幕上,1dp=1px=1/160英寸。随着密度变化,对应的像素数量也变化,但并没有直接的变化比例。
  • dip:等同于dp
  • dpi(dots per inch):表示的是每英尺的点(像素)数,我们平常说的手机屏幕的大小比如4.5英寸,指的是屏幕对角线的长度是4.5英寸,那么我们的dpi的计算公式就是:
    images.cnitblog.com_blog_432441_201310_26204857-4e34bb5c8a054c278859711a49b0d947.jpg
    dpi表示的是每英尺的像素,dpi越高,说明屏幕细粒度越高,也就越清晰了。
  • sp(与密度和字体缩放度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。

尽量使用dp作为空间大小单位,sp作为和文字相关大小单位。

详细解释

Android的屏幕密度是以160为基准的,屏幕密度(densityDpi)为160时,是将一英寸分为160份,每一份是1像素。 如果屏幕密度(densityDpi)为240时,是将一英寸分为240份,每一份是1像素。 1英寸/160(机器x) = 1英寸/240(机器y) = 1px 打个比方,一个三英寸的显示屏幕的机器,如果屏幕密度(densityDpi)为160,即密度比(density)1.0时,画一条160dip和160px的线条,两个都是1英寸。 可如果还是三英寸的屏幕,如果屏幕密度(densityDpi)变为320,即密度比(density)2.0时,1英寸有320像素了,此时160px显示就是半英寸。 160dip显示还是1英寸,因为 1dip = 1px * density。

可是有没有注意到,同样宽的屏幕,比如3英寸,如果density 是1.0的话,分辨率就是480px*x或480dip*x,如果还是3英寸的,density 是1.5的话 ,分辨率就是480*1.5 = 720px*x 或480dip*x。 (这里的x代表屏幕的高度)。 如果同样是240dip,在两款机器上显示都是一半的长度,这样就保证了比例。 这样的话如果是480分辨率和720分辨率的话,可以采用同一个布局文件了。

又但可是,我见过的机器只有320*240(0.75) ,480*320(1.0) ,800*480(1.5),854*480(1.5) ,如果是480 和 800 两个版本,同一条线480dip ,480显示全屏,800则显示 480 / (800 / 1.5) 屏。 其中800/1.5是屏幕的总dip。 我们平时说的分辨率都是以像素px为单位的。 由此可见,就算是用dip,也不能保证不同分辨率的机器的布局比例完全一样。 但还是有好处的。 因为如果是用px的话,有些时候一些布局直接跑到了屏幕外边,调试起来很麻烦。

换算公式

final float densityDpi = context.getResources().getDisplayMetrics().densityDpi;
pixs =dips * (densityDpi/160). 
dips=(pixs*160)/densityDpi

或者

public static int dip2px(Context context, float dipValue){
  final float density = context.getResources().getDisplayMetrics().density;
  return (int)(dipValue * density + 0.5f);
}
public static int px2dip(Context context, float pxValue){
  final float density = context.getResources().getDisplayMetrics().density;
  return (int)(pxValue / density + 0.5f);
}

示例代码

DisplayMetrics metric = new DisplayMetrics();  
getWindowManager().getDefaultDisplay().getMetrics(metric);  
int width = metric.widthPixels; // 屏幕宽度(像素)  
int height = metric.heightPixels; // 屏幕高度(像素)  
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)  
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240) 

相关链接

开发/android/长度单位.txt · 最后更改: 2015-01-07 16:27 由 danding

粤ICP备16007019号-3