android主要支持的像素单位有:px(像素)、in(英寸)、mm(毫米)、pt(磅,1/72英寸)、dp(与设备无关的显示单位)、dip(就是dp)、sp(用于设置字体大小),其中常用的就是px、dp和sp三种。

屏幕分辨率:指在纵向和横向方向上的像素点数,单位是px,如1920*1080。同样尺寸的屏幕,看起来越清晰的屏幕,其像素密度越高,以px计量的分辨率就越大。

屏幕尺寸:是指屏幕对角线长度,单位是英寸,常见尺寸有:4.0,4.3,4.7,5.0,6.0,7.0等。

屏幕像素密度:ppi pixel per inch的缩写,意思是每英寸屏幕上的像素数,因为屏幕尺寸是商家生产时就规定好的,屏幕尺寸一样的手机,分辨率也不一定一样,所以通常取屏幕对角线像素数量和屏幕尺寸(屏幕对角线长度)来计算屏幕像素密度,计算公式就是通过勾股定理和分辨率计算得到屏幕对角线像素数量,再除以屏幕尺寸。

dpi:dot per inch点像素密度,它的计算方法也和ppi一样,但从很多方面上,dpi是和ppi有区别的,ppi是用在设备上的单位,比如显示器;而dpi是用在印刷品上的单位,比如要打印一幅地图;在图像上的像素看起来是一个个点或者方块,这时候通常就将两者混用。要注意的是,我们并不能在Android适配时直接使用手机参数上的ppi值,而是使用dpi,Android对dpi根据大小做了规定的分档,以160dpi为基准,分为ldpi(120dpi)、mdpi(160dpi)、hdpi(240dpi)、xhdpi(320dpi)、xxhdpi(480dpi)等,当然现在手机的分辨率和尺寸更加多,像560dpi,600dpi也有,举个例子,Nexus 6 ppi是493,那按道理我们计算出来的dpi也是493,但Android的分档里面并没有493dpi,所以实际上它的dpi是560,而这个值我们是可以在手机的系统文件里面修改的。一定程度上,我们甚至可以说分辨率和适配没有关系,我们需要考虑的是dpi值,而这个值是可以与分辨率没有关系的,是手机厂家设的。

dp/dip:density independent pixels密度无关像素,Android设计常用的单位,它与px存在换算关系,Android规定,在160dpi时,1dp等于1px,那么320dpi时,1dp就等于2px,

  • px: pixels(像素): 1px的长度就对应屏幕一个像素点的大
  • dp/dip: device-independent pixels(设备无关像素)
  • 与px存在换算关系

           1dp =  (dpi / 160)  px

1dp =  density  px      160  = 1px    120  = 0.75    320  = 2px

1px = 1/density dp

当px换算为dp时,dp =160 * px / dpi;dp换算为px时,px = dp * dpi /160

  • sp:scaled pixels(可缩放像素):与dp类似,是Android推荐使用的字体大小单位,同样是密度无关。android手机在系统设置里面可以设置字体的大小(小、普通、大、超大),设置普通字体时,同数值dp和sp的文字看起来是一样大的,但如果设置为大字体,用dp设置大小的文字没有变化,而用sp设置大小的文字就变大了。所以说,dp与系统设置的字体大小没有关系,而sp会随系统设置的字体大小来变大或者变小。

dp px 的比较 ?


px 为单位的长度 , 在差手机上会变大 , 在好手机上变小


dp 为单位则不会变化


 


dp sp 的比较 ?


用户可以在系统设置中设置文本的大小


如果字体大小使用 sp 为单位 , 设置有效果


如果字体大小使用 dp 为单位 , 设置没有效果



 


注意 : Android 在运行时会自动将 dp /dip/ sp 为单位的尺寸转换为像素单位的值


在布局文件视图的宽高尽量用 match_parent / wrap_content


如果必须指定特定值 , 使用 dp /dip 做单位


文本大小使用 sp 做单位


 




android屏幕物理尺寸 安卓尺寸单位_Android



 


以下是一个应用类,方便进行px和dp之间的转换。

public class DensityUtil {  
  
    /** 
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
     */  
    public static int dip2px(Context context, float dpValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (dpValue * scale + 0.5f);  
    }  
  
    /** 
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 
     */  
    public static int px2dip(Context context, float pxValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (pxValue / scale + 0.5f);  
    }  
}

代码里面的加0.5f,其目的是四舍五入,因为浮点数强制转为整型时,小数点后面数值会被直接咔嚓掉,所以如果原小数位后大于0.5,再加0.5就会进一,就曲线实现了四舍五入。


dp和px的使用场景

xml布局文件中,因为设备无关性,所以除了sp用于设置文字大小外,其余要用大小的地方都是写dp。但在代码之中,android用于设置大小的函数都是以px为单位。不管是LayoutParams里的widthheight,还是setMarginssetPadding,其参数单位都是px,所以要想在代码中使用dp设置布局大小或者间距,得先把dp值转换成px值才好。代码示例

int dip_10 = DensityUtil.dip2px(mContext, 10L);
LinearLayout.LayoutParams titleParams
 = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
		titleParams.setMargins(dip_10, dip_10, dip_10, dip_10);