Android计量单位px,in,mm,pt,dp,dip,sp和获取屏幕尺寸与密度

Wesley13
• 阅读 887

###########################################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*800pxdensity :1.5测试代码:
 
 
 
 
 

 

 

  
  
  
  
  
  
  
 
  
 
  
 
   
    
   
  
    
     
    
   
     
     [java]  
    
   
     
     view plain 
    
   
     
     copy 
    
   
     
     print 
    
   
     
     ? 
    
   
     
      
   
  
    
     
  
 
   
   
  
  
  
  
  
 
  
 
  
 
   
    
   
  
    
    // 获取屏幕密度(方法1)   
   
  
    
    int screenWidth  = getWindowManager().getDefaultDisplay().getWidth();       // 屏幕宽(像素,如:480px)   
   
  
    
    int screenHeight = getWindowManager().getDefaultDisplay().getHeight();      // 屏幕高(像素,如:800p)   
   
  
    
       
   
  
    
    Log.e(TAG + "  getDefaultDisplay", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);   
   
  
    
       
   
  
    
       
   
  
    
    // 获取屏幕密度(方法2)   
   
  
    
    DisplayMetrics dm = new DisplayMetrics();   
   
  
    
    dm = getResources().getDisplayMetrics();   
   
  
    
       
   
  
    
    float density  = dm.density;        // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)   
   
  
    
    int densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)   
   
  
    
    float xdpi = dm.xdpi;              
   
  
    
    float ydpi = dm.ydpi;   
   
  
    
       
   
  
    
    Log.e(TAG + "  DisplayMetrics", "xdpi=" + xdpi + "; ydpi=" + ydpi);   
   
  
    
    Log.e(TAG + "  DisplayMetrics", "density=" + density + "; densityDPI=" + densityDPI);   
   
  
    
       
   
  
    
    screenWidth  = dm.widthPixels;      // 屏幕宽(像素,如:480px)   
   
  
    
    screenHeight = dm.heightPixels;     // 屏幕高(像素,如:800px)   
   
  
    
       
   
  
    
    Log.e(TAG + "  DisplayMetrics(111)", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);   
   
  
    
       
   
  
    
       
   
  
    
       
   
  
    
    // 获取屏幕密度(方法3)   
   
  
    
    dm = new DisplayMetrics();   
   
  
    
    getWindowManager().getDefaultDisplay().getMetrics(dm);   
   
  
    
       
   
  
    
    density  = dm.density;      // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)   
   
  
    
    densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)   
   
  
    
    xdpi = dm.xdpi;            
   
  
    
    ydpi = dm.ydpi;   
   
  
    
       
   
  
    
    Log.e(TAG + "  DisplayMetrics", "xdpi=" + xdpi + "; ydpi=" + ydpi);   
   
  
    
    Log.e(TAG + "  DisplayMetrics", "density=" + density + "; densityDPI=" + densityDPI);   
   
  
    
       
   
  
    
    int screenWidthDip = dm.widthPixels;        // 屏幕宽(dip,如:320dip)   
   
  
    
    int screenHeightDip = dm.heightPixels;      // 屏幕宽(dip,如:533dip)   
   
  
    
       
   
  
    
    Log.e(TAG + "  DisplayMetrics(222)", "screenWidthDip=" + screenWidthDip + "; screenHeightDip=" + screenHeightDip);   
   
  
    
       
   
  
    
    screenWidth  = (int)(dm.widthPixels * density + 0.5f);      // 屏幕宽(px,如:480px)   
   
  
    
    screenHeight = (int)(dm.heightPixels * density + 0.5f);     // 屏幕高(px,如:800px)   
   
  
    
       
   
  
    
    Log.e(TAG + "  DisplayMetrics(222)", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);   
  
 
   
   
 
 
 
 
 

 

 

  
  结果如下:

 
 
 
 
 

 

 

  
  
  
  
  
  
  
 
  
 
  
 
   
    
   
  
    
     
    
   
     
     [java]  
    
   
     
     view plain 
    
   
     
     copy 
    
   
     
     print 
    
   
     
     ? 
    
   
     
      
   
  
    
     
  
 
   
   
  
  
  
  
  
 
  
 
  
 
   
    
   
  
    
    E/== MyScreenActivity ===================================  getDefaultDisplay( 8509): screenWidth=320; screenHeight=533   
   
  
    
    E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=156.3077; ydpi=157.51938   
   
  
    
    E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.0; densityDPI=160   
   
  
    
    E/== MyScreenActivity ===================================  DisplayMetrics(111)( 8509): screenWidth=320; screenHeight=533   
   
  
    
    E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=234.46153; ydpi=236.27907   
   
  
    
    E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.5; densityDPI=240   
   
  
    
    E/== MyScreenActivity ===================================  DisplayMetrics(222)( 8509): screenWidthDip=320; screenHeightDip=533   
   
  
    
    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
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
凯特林 凯特林
3年前
移动端H5开发常用技巧总结
html篇常用的meta属性设置meta对于移动端的一些特殊属性,可根据需要自行设置<meta name"screenorientation" content"portrait" //Android 禁止屏幕旋转<meta name"fullscreen" content"yes"             //全屏显示
哪吒 哪吒
3年前
栅格布局xs sm md lg xl
1.单位xl对应屏幕1920px超大显示器lg对应屏幕1200px,小于1920px台式19201080显示器md对应屏幕992px,小于1200px适合笔记本sm对应屏幕768px,小于992px适合平板xs对应屏幕<768手机端屏幕例如有如下代码将屏幕分成3列,进行响应式布局当屏幕的大小变成手机般大小(屏幕宽度<768px)时只显示xs2
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
3年前
Android屏幕大小适配问题解决
一、一些基本概念1、长度(真实长度):英寸、inch2、分辨率:density每英寸像素数 dpi(密度)3、像素:px4、dip的公式:px/dipdpi/160 所以dip类似于英寸、长度(dpdip,sp类似于dip)5、相对分辨率长px\宽px二、平时我们一些概念的混淆1、平时我们说手机的分辨率是3
Stella981 Stella981
3年前
Android中dp和px之间进行转换
在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip)。一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致。但是在代码中,如何处理呢?很多控件的方法中都只提供了设置px的方法,例如setPadding,并没有提供设置dp的方法。这个时候,如果需要设置dp的话,就要将dp转换成px了。以下是一个应用类,方便进行px和
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这