美文网首页Android
android 的px,dp与sp的区别以及换算

android 的px,dp与sp的区别以及换算

作者: 枫叶1234 | 来源:发表于2019-05-21 10:02 被阅读0次

    1、px

    即像素,1px代表屏幕上的一个物理像素点。
    “pixel” 的缩写,像素。是画面显示的基本单位,真实的像素并不是点或者方块(虽然有时这样显示),也没有实际固定长度,只是一个抽象的取样。设计中的像素和实际显示屏上的像素相对应。

    屏幕的分辨率一般就描述为“宽向像素数X纵向像素数”。比如 Android手机常见的分辨率有:320 X 480, 480 X 800, 1080 X 1920等。

    2、dp

    dip:device independent pixels(设备独立像素),dp与dip一样,不同的设备有不同的显示效果,一般为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。
    定义dp为 160dpi 时的一个像素大小;那么到 320 dpi 时,它就相当于两个像素。

    px= dp (dpi/160)
    这样的话,假如做一个50
    50dp的icon,放到160dpi的屏幕上就是50px50px,放到320dpi的屏幕上就是100px100px。各元素的布局和比例便不会失调。

    3、sp

    sp:scale-independent pixels(缩放独立像素),与缩放无关的抽象像素,它和dp很相似,但唯一的区别在于,Android系统允许用户自定义文字尺寸大小(小,正常,大,超大等),当文字尺寸是“正常”时,1sp=1dp=0.00625inch(英寸),当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625inch
    这里插一句 sp 这个单位,sp 跟 dp 类似,全称是 scale-independent pixel (也会缩写为 sip), 即“独立比例像素”。sp 主要用作字体的单位,开发用此单位设置文字大小,这样在不同像素密度的屏幕上能进行同比例的扩大缩小。

    4、dpi

    dpi是像素密度,指的是在系统软件上指定的单位尺寸的像素数量,它往往是写在系统出厂配置文件的一个固定值

    我为什么要强调它是软件系统上的概念?
    因为大家买手机的时候,往往会听到另一个叫ppi的参数,这个在手机屏幕中指的也是像素密度,但是这个是物理上的概念,它是客观存在的不会改变。dpi是软件参考了物理像素密度后,人为指定的一个值,这样保证了某一个区间内的物理像素密度在软件上都使用同一个值。这样会有利于我们的UI适配。

    比如,几部相同分辨率不同尺寸的手机的ppi可能分别是是430,440,450,那么在Android系统中,可能dpi会全部指定为480.这样的话,dpi/160就会是一个相对固定的数值,这样就能保证相同分辨率下不同尺寸的手机表现一致。

    我们可以说,通过dp加上自适应布局和weight比例布局可以基本解决不同手机上适配的问题,这基本是最原始的Android适配方案。

    dpi:dots per inch(每英寸点数,或者说每英寸像素数目 更易懂),即:是指屏幕上每英寸(1英寸 = 2.54 厘米)距离中有多少个像素点。如果屏幕为 320*240,屏幕长 2 英寸宽 1.5 英寸,Dpi = 320 / 2 = 240 / 1.5 = 160。
    由设备决定,是写死的,可以通过context.getResources().getDisplayMetrics().densityDpi获取到。当然,也可以通过以下方法算出:

    dpi=横向分辨率/横向英寸数=纵向分辨率/纵向英寸数
    安卓手机种类多样,有各种屏幕像素密度。比如120dpi是低密度(ldpi)类型,160dpi 是中密度(mdpi),240dpi是高密度(hdpi),320dpi是超高密度(xhdpi),480dpi是超超高密度(xxhdpi)。

    Google 规定的屏幕密度列表:

    ldpi (low) ~120dpi
    mdpi (medium) ~160dpi
    hdpi (high) ~240dpi
    xhdpi (extra-high) ~320dpi
    xxhdpi (extra-extra-high) ~480dpi
    xxxhdpi (extra-extra-extra-high) ~640dpi

    就如有的UI给的图会有这样的标注:


    屏幕快照 2019-05-21 上午10.00.15.png

    5、 ppi

    这个在手机屏幕中指的也是像素密度,但是这个是物理上的概念,它是客观存在的不会改变
    dpi是软件参考了物理像素密度后,人为指定的一个值,这样保证了某一个区间内的物理像素密度在软件上都使用同一个值。这样会有利于我们的UI适配

    6、 in

    inches的缩写,英寸。就是屏幕的物理长度单位。一英寸等于2.54cm。比如Android手机常见的尺寸有5寸、5.5寸、6寸等,这里的长度都是指手机对角线的长度。

    7、pt

    “points” 的缩写,点。一个点等于1/72英寸,所以“点”也是个长度单位而已。

    8、 Density(密度)

    这个是指屏幕上每平方英寸(2.54 ^ 2 平方厘米)中含有的像素点数量。

    单位的换算:

    dpi与density的关系

    dpi = density*160

    px与density

    px = density * dp
    px = (dpi / 160)*dp

    dp与px

    px=dp*(dpi/160)
    dp=px/(dpi/160)

    sp与px

    px=sp*(dpi/160)
    sp=px/(dpi/160)

    获取DisplayMetrics对象方法:

    DisplayMetrics dm=new DisplayMetrics();
    //获得DisplayMetrics对象方法一
    //dm=context.getResources().getDisplayMetrics();
    //获得DisplayMetrics对象方法二
    ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
    

    px转其他单位代码:(该方法来自TypedValue)

    public static float applyDimension(int unit, float value,
       DisplayMetrics metrics)
       {
     switch (unit) {
     case COMPLEX_UNIT_PX:
         return value;
     case COMPLEX_UNIT_DIP:
         return value * metrics.density;
     case COMPLEX_UNIT_SP:
         return value * metrics.scaledDensity;
     case COMPLEX_UNIT_PT:
         return value * metrics.xdpi * (1.0f/72);
     case COMPLEX_UNIT_IN:
         return value * metrics.xdpi;
     case COMPLEX_UNIT_MM:
         return value * metrics.xdpi * (1.0f/25.4f);
     }
     return 0;
        }
    

    另外一种px转dp的代码:

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

    dp转px:

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

    相关文章

      网友评论

        本文标题:android 的px,dp与sp的区别以及换算

        本文链接:https://www.haomeiwen.com/subject/uhkdzqtx.html