zoukankan      html  css  js  c++  java
  • Android计量单位px,in,mm,pt,dp,dip,sp和获取屏幕尺寸与密度

    ###########################################Android计量单位###########################################

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


    dip和px 的关系:
    QVGA:    density=0.75;      densityDpi=120;     QVGA(240*320)

    HVGA:    density=1.0;        densityDpi=160;     HVGA(320*480)

    VGA:       density=1.0;        densityDpi=160;     VGA(480*640)   

    WVGA:   density=1.5;        densityDpi=240;     WVGA(480*800)

    WQVGA:density=2.0;        densityDpi=120;     WQVGA(240*400)

    densityDip值表示每英寸有多少个显示点,与分辨率是两个概念


    不同densityDpi下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例

    densityDpi=120时 

    屏幕实际分辨率为240px*400px (两个点对应一个分辨率)

    状态栏和标题栏高各19px或者25dip 

    横屏是屏幕宽度400px 或者800dip,工作区域高度211px或者480dip

    竖屏时屏幕宽度240px或者480dip,工作区域高度381px或者775dip

    densityDpi=160时 

    屏幕实际分辨率为320px*533px (3个点对应两个分辨率)

    状态栏和标题栏高个25px或者25dip 

    横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者480dip

    竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip

    densityDpi=240时 

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

    apk的资源包中

    当屏幕densityDpi=240时,使用hdpi 标签的资源

    当屏幕densityDpi=160时,使用mdpi标签的资源

    当屏幕densityDpi=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);
    }


    VGA        :   640*480

    QVGA     :   320*240

    HVGA     :   320*480

    WVGA    :   800*480

    WQVGA :   480X272或400X240


    分辨率(水平数×垂直数) 类型 比例 
    88×72 QQCIF 11:9 
    128×96 SUB-QCIF 4:3 
    128×128 知道的补上 1:1 
    160×120 QQVGA 4:3 
    176×144 QCIF 11:9 
    208×176 Sub-QVGA- 13:11 
    220×176 Sub-QVGA 5:4 
    240×176 Sub-QVGA+ 15:11 
    320×200 CGA 16:10 
    320×240 QVGA 4:3 
    352×288 CIF 11:9 
    640×360 nHD 4:3 
    400×240 WQVGA 5:3 
    400×320 WQVGA 5:4 
    480×240 WQVGA 2:1 
    480×272 WQVGA 16:9 
    480×320 HQVGA 3:2 
    640×480 VGA 4:3 
    640×350 EGA 64:35 
    720×480 VGA+ 3:2 
    768×576 PAL   
    800×480 WVGA 5:3 
    854×480 FWVGA 16:9 
    800×600 SVGA 4:3 
    960×540 QHD 16:9 
    960×640 DVGA 3:2 
    1024×600 WSVGA 128:75 
    1024×768 XGA 4:3 
    1280×768 WXGA 15:9 
    1280×800 WXGA 16:10 
    1280×960 UxGA/XVGA 4:3 
    1280×1024 SXGA 25:16 
    1400×1050 SXGA+ 4:3 
    1440×900 WXGA+ 16:10 
    1600×1024 WSXGA 25:16 
    1600×1050 WSXGA 32:21 
    1600×1200 USVGA/UXGA/UGA 4:3 
    1680×1050 WSXGA+ 16:10 
    1900×1200 UXGA 19:12 
    1920×1080 WSUVGA+(WSUGA/HDTV) 4:3 
    1920×1200 WUXGA 16:10 
    2048×1536 SUVGA(QXGA) 4:3 
    2560×1600 UWXGA 16:10 
    2560×2048 USXGA 5:4 
    3200×2400 QUXGA 4:3 
    3840×2400 WQUXGA 16:10 
    ###########################################Android获取屏幕尺寸与密度##########################################

    android中获取屏幕的长于宽,参考了网上有很多代码,但结果与实际不符,如我的手机是i9000,屏幕大小是480*800px,得到的结果却为320*533

    结果很不靠谱,于是自己写了几行代码,亲测一下

    测试参数:

    测试环境: i9000(三星)

    物理屏幕:480*800px

    density :1.5

    测试代码:

    1. // 获取屏幕密度(方法1)  
    2. int screenWidth  = getWindowManager().getDefaultDisplay().getWidth();       // 屏幕宽(像素,如:480px)  
    3. int screenHeight = getWindowManager().getDefaultDisplay().getHeight();      // 屏幕高(像素,如:800p)  
    4.   
    5. Log.e(TAG + "  getDefaultDisplay""screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  
    6.   
    7.   
    8. // 获取屏幕密度(方法2)  
    9. DisplayMetrics dm = new DisplayMetrics();  
    10. dm = getResources().getDisplayMetrics();  
    11.   
    12. float density  = dm.density;        // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)  
    13. int densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)  
    14. float xdpi = dm.xdpi;             
    15. float ydpi = dm.ydpi;  
    16.   
    17. Log.e(TAG + "  DisplayMetrics""xdpi=" + xdpi + "; ydpi=" + ydpi);  
    18. Log.e(TAG + "  DisplayMetrics""density=" + density + "; densityDPI=" + densityDPI);  
    19.   
    20. screenWidth  = dm.widthPixels;      // 屏幕宽(像素,如:480px)  
    21. screenHeight = dm.heightPixels;     // 屏幕高(像素,如:800px)  
    22.   
    23. Log.e(TAG + "  DisplayMetrics(111)""screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  
    24.   
    25.   
    26.   
    27. // 获取屏幕密度(方法3)  
    28. dm = new DisplayMetrics();  
    29. getWindowManager().getDefaultDisplay().getMetrics(dm);  
    30.   
    31. density  = dm.density;      // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)  
    32. densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)  
    33. xdpi = dm.xdpi;           
    34. ydpi = dm.ydpi;  
    35.   
    36. Log.e(TAG + "  DisplayMetrics""xdpi=" + xdpi + "; ydpi=" + ydpi);  
    37. Log.e(TAG + "  DisplayMetrics""density=" + density + "; densityDPI=" + densityDPI);  
    38.   
    39. int screenWidthDip = dm.widthPixels;        // 屏幕宽(dip,如:320dip)  
    40. int screenHeightDip = dm.heightPixels;      // 屏幕宽(dip,如:533dip)  
    41.   
    42. Log.e(TAG + "  DisplayMetrics(222)""screenWidthDip=" + screenWidthDip + "; screenHeightDip=" + screenHeightDip);  
    43.   
    44. screenWidth  = (int)(dm.widthPixels * density + 0.5f);      // 屏幕宽(px,如:480px)  
    45. screenHeight = (int)(dm.heightPixels * density + 0.5f);     // 屏幕高(px,如:800px)  
    46.   
    47. Log.e(TAG + "  DisplayMetrics(222)""screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  
    结果如下:

    1. E/== MyScreenActivity ===================================  getDefaultDisplay( 8509): screenWidth=320; screenHeight=533  
    2. E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=156.3077; ydpi=157.51938  
    3. E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.0; densityDPI=160  
    4. E/== MyScreenActivity ===================================  DisplayMetrics(111)( 8509): screenWidth=320; screenHeight=533  
    5. E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=234.46153; ydpi=236.27907  
    6. E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.5; densityDPI=240  
    7. E/== MyScreenActivity ===================================  DisplayMetrics(222)( 8509): screenWidthDip=320; screenHeightDip=533  
    8. E/== MyScreenActivity ===================================  DisplayMetrics(222)( 8509): screenWidth=480; screenHeight=800  

    分析结果:

    在onDraw()方法中

    方法1和2,得到的结果都一致,均为320*533,明显不是测试机i9000的屏幕大小

    方法3,将方法1和2得到的结果,乘以density后,完美的480*800,perfect!

    注: density 大于1的情况下,需要设置targetSdkVersion在4-9之间,例如
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="10" />

    但是,这就说明方法3一定是通用的吗?

    回答是否定的,因为我也在模拟器、HTC G14物理机,以及ViewSonic、Galaxy平板上测试过,方法3在density=1.5时,放大了实际屏幕值,例如:HTC G14

    在HTC G14上,实际屏幕大小,直接通过dm.widthPixels、dm.heightPixels便得到了实际物理屏幕大小(540,960)

    导致无法通过一种通用的方法获取真实物理屏幕大小的原因,可能就是因为Android系统开源,不同的手机生产厂商没有统一的制造标准,来规定手机屏幕。

    仔细分析代码,发现问题出在代码:

    getWindowManager().getDefaultDisplay().getMetrics(dm)

    Initialize a DisplayMetrics object from this display's data.

    dm = getResources().getDisplayMetrics()

    Return the current display metrics that are in effect for this resource object. The returned object should be treated as read-only.

    测试源码

    原文:Android 获取屏幕尺寸与密度 Android的计量单位px,in,mm,pt,dp,dip,sp
  • 相关阅读:
    Ubuntu使用Thinkpad-T14-Gen1指纹识别
    解决ubuntu20.04无法安装python2-pyqt5
    ssh添加允许用户/组
    IP-CIDR对应子网地址范围查询
    Gateway整合Swagger
    Java 过滤器Url通配符处理
    HttpServletRequest重复读取
    nmap 快速扫描 大量主机端口
    MAC 设置多个JAVA版本切换
    XSS
  • 原文地址:https://www.cnblogs.com/xyang0917/p/4172508.html
Copyright © 2011-2022 走看看