zoukankan      html  css  js  c++  java
  • px,in,mm,pt,dp,dip,sp 之间的换算公式以及区别 屏幕密度

    px   :是屏幕的像素点
    in    :英寸
    mm :毫米
    pt    :磅,1/72 英寸
    dp   :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px
    dip  :等同于dp
    sp   :同dp相似,但还会根据用户的字体大小偏好来缩放。
    建议使用sp作为文本的单位,其它用dip


    针对dip和px 的关系,做以下概述:
     

    下面是一些分辨率信息 density就是屏幕密度

    名称 分辨率 屏幕密度
    QVGA 320*240 120
    WQVGA400 400*240 120
    WQVGA432 432*240 120
    HVGA 640*480 160
    WSVGA 1024*600 160
    WXGA800 1280*800 160
    WVGA800 800*480 240
    WVGA854 854*480 240
    WXGA720 1280*720 320


    density值表示每英寸有多少个显示点,与分辨率是两个概念。
    不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例


    下面以几个真实机器来加深一下相关概念的认知

     三星i5801HTC wildfire S(g13)HTC sensation(g14)meizu m9
    分辨率 240*400 320*480 540*960 640*960
    屏幕尺寸 3.2英寸 3.2英寸 4.3英寸 3.5英寸
    屏幕密度 145.77 180.27 256.15 329.65
    DisplayMetrics得出的DPI 120 160 240 320

    黄色部分为使用上述公式计算的屏幕密度,绿色部分为使用DisplayMetrics得出的dpi,可以看到比较接近

    有两方面的原因,导致这两个数据不一致

    1.厂商给出的屏幕尺寸参数不是太精确

    2.DisplayMetrics中定义的密度值只有120、160、213、240、320

    ----------------------------------------

    这里从另一个角度可以进行屏幕尺寸的反推,以meizu m9为例,通过DisplayMetrics可以得到其xdpi和ydpi均为325.12

    这样屏幕宽度=640/325.12=1.9685英寸,屏幕高度=960/325.12=2.9527英寸

    使用勾股定理计算得出,对角线尺寸为3.5487英寸





    density=120时 

    屏幕实际分辨率为240px*400px (两个点对应一个分辨率)
    状态栏和标题栏高各19px或者25dip 
    横屏是屏幕宽度400px 或者800dip,工作区域高度211px或者480dip
    竖屏时屏幕宽度240px或者480dip,工作区域高度381px或者775dip

    density=160时 

    屏幕实际分辨率为320px*533px (3个点对应两个分辨率)
    状态栏和标题栏高个25px或者25dip 
    横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者480dip
    竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip

    density=240时 

    屏幕实际分辨率为480px*800px (一个点对于一个分辨率)
    状态栏和标题栏高个38px或者25dip 
    横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者480dip
    竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip

    apk的资源包中

    当屏幕density=240时,使用hdpi 标签的资源
    当屏幕density=160时,使用mdpi标签的资源
    当屏幕density=120时,使用ldpi标签的资源。
    不加任何标签的资源是各种分辨率情况下共用的。
    布局时尽量使用单位dip,少使用px

     

    dp与px换算公式:

    pixs =dips * (densityDpi/160)

    dips=(pixs*160)/densityDpi

     

    dp与px转换的方法:

    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.getResource().getDisplayMetrics().density;
      return (int)(pxValue / scale +0.5f);
    }

     

     

    名词

    解释

    Px

    (Pixel像素)

    不同设备显示效果相同。这里的“相同”是指像素数不会变,比如指定UI长度是100px,那不管分辨率是多少UI长度都是100px。也正是因为如此才造成了UI在小分辨率设备上被放大而失真,在大分辨率上被缩小。

    Screen Size

    (屏幕尺寸)

    一般所说的手机屏幕大小如1.6英寸、1.9英寸、2.2英寸,都是指的对角线的长度,而不是手机面积。我们可以根据勾股定理获取手机的宽和长,当然还有面积。

    Resolution

    (分辨率)

    指手机屏幕垂直和水平方向上的像素个数。比如分辨率是480*320,则指设备垂直方向有480个像素点,水平方向有320个像素点。

    Dpi

    (dots per inch

      像素密度)

    指每英寸中的像素数。如160dpi指手机水平或垂直方向上每英寸距离有160个像素点。假定设备分辨率为320*240,屏幕长2英寸宽1.5英寸,dpi=320/2=240/1.5=160

    注意:该值对应于DisplayMetrics类中属性densityDpi的值

    Density

    (密度)

    指每平方英寸中的像素数。

    Density=Resolution/Screen size

    注意:在DisplayMetrics类中属性density的值为dpi/160,可用于px与dip的互相转换

    Dip

    (Device-independent pixel,设备独立像素)

    同dp,可作长度单位,不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。dip和具体像素值的对应公式是dip值 =设备密度/160* pixel值,可以看出在dpi(像素密度)为160dpi的设备上1px=1dip

    Sp

    (ScaledPixels

     放大像素)

    主要用于字体显示(best for textsize)。根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。

     
  • 相关阅读:
    jvm基本结构和解析
    多态的意思
    java中对象的简单解读
    double类型和int类型的区别
    python 解析xml文件
    win10不能映射Ubuntu共享文件
    Qt程序打包
    Ubuntu boot分区文件误删,系统无法启动,怎么解
    ubuntu Boot空间不够问题“The volume boot has only 5.1MB disk space remaining”
    Ubuntu 分辨率更改 xrandr Failed to get size of gamma for output default
  • 原文地址:https://www.cnblogs.com/firecode/p/2497904.html
Copyright © 2011-2022 走看看