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

1分辨率(水平数×垂直数) 类型 比例 288×72 QQCIF 11:9 3128×96 SUB-QCIF 4:3 4128×128 知道的补上 1:1 5160×120 QQVGA 4:3 6176×144 QCIF 11:9 7208×176 Sub-QVGA- 13:11 8220×176 Sub-QVGA 5:4 9240×176 Sub-QVGA+ 15:11 10320×200 CGA 16:10 11320×240 QVGA 4:3 12352×288 CIF 11:9 13640×360 nHD 4:3 14400×240 WQVGA 5:3 15400×320 WQVGA 5:4 16480×240 WQVGA 2:1 17480×272 WQVGA 16:9 18480×320 HQVGA 3:2 19640×480 VGA 4:3 20640×350 EGA 64:35 21720×480 VGA+ 3:2 22768×576 PAL   23800×480 WVGA 5:3 24854×480 FWVGA 16:9 25800×600 SVGA 4:3 26960×540 QHD 16:9 27960×640 DVGA 3:2 281024×600 WSVGA 128:75 291024×768 XGA 4:3 301280×768 WXGA 15:9 311280×800 WXGA 16:10 321280×960 UxGA/XVGA 4:3 331280×1024 SXGA 25:16 341400×1050 SXGA+ 4:3 351440×900 WXGA+ 16:10 361600×1024 WSXGA 25:16 371600×1050 WSXGA 32:21 381600×1200 USVGA/UXGA/UGA 4:3 391680×1050 WSXGA+ 16:10 401900×1200 UXGA 19:12 411920×1080 WSUVGA+(WSUGA/HDTV) 4:3 421920×1200 WUXGA 16:10 432048×1536 SUVGA(QXGA) 4:3 442560×1600 UWXGA 16:10 452560×2048 USXGA 5:4 463200×2400 QUXGA 4:3 473840×2400 WQUXGA 16:10 48 49###########################################Android获取屏幕尺寸与密度########################################## 50 51android中获取屏幕的长于宽,参考了网上有很多代码,但结果与实际不符,如我的手机是i9000,屏幕大小是480*800px,得到的结果却为320*533结果很不靠谱,于是自己写了几行代码,亲测一下测试参数:测试环境: i9000(三星)物理屏幕:480*800pxdensity :1.5测试代码: 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 [java]  84 85 86 87 view plain 88 89 90 91 copy 92 93 94 95 print 96 97 98 99 ? 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 // 获取屏幕密度(方法1)   128 129 130 131 int screenWidth  = getWindowManager().getDefaultDisplay().getWidth();       // 屏幕宽(像素,如:480px)   132 133 134 135 int screenHeight = getWindowManager().getDefaultDisplay().getHeight();      // 屏幕高(像素,如:800p)   136 137 138 139    140 141 142 143 Log.e(TAG + "  getDefaultDisplay", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);   144 145 146 147    148 149 150 151    152 153 154 155 // 获取屏幕密度(方法2)   156 157 158 159 DisplayMetrics dm = new DisplayMetrics();   160 161 162 163 dm = getResources().getDisplayMetrics();   164 165 166 167    168 169 170 171 float density  = dm.density;        // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)   172 173 174 175 int densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)   176 177 178 179 float xdpi = dm.xdpi;              180 181 182 183 float ydpi = dm.ydpi;   184 185 186 187    188 189 190 191 Log.e(TAG + "  DisplayMetrics", "xdpi=" + xdpi + "; ydpi=" + ydpi);   192 193 194 195 Log.e(TAG + "  DisplayMetrics", "density=" + density + "; densityDPI=" + densityDPI);   196 197 198 199    200 201 202 203 screenWidth  = dm.widthPixels;      // 屏幕宽(像素,如:480px)   204 205 206 207 screenHeight = dm.heightPixels;     // 屏幕高(像素,如:800px)   208 209 210 211    212 213 214 215 Log.e(TAG + "  DisplayMetrics(111)", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);   216 217 218 219    220 221 222 223    224 225 226 227    228 229 230 231 // 获取屏幕密度(方法3)   232 233 234 235 dm = new DisplayMetrics();   236 237 238 239 getWindowManager().getDefaultDisplay().getMetrics(dm);   240 241 242 243    244 245 246 247 density  = dm.density;      // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)   248 249 250 251 densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)   252 253 254 255 xdpi = dm.xdpi;            256 257 258 259 ydpi = dm.ydpi;   260 261 262 263    264 265 266 267 Log.e(TAG + "  DisplayMetrics", "xdpi=" + xdpi + "; ydpi=" + ydpi);   268 269 270 271 Log.e(TAG + "  DisplayMetrics", "density=" + density + "; densityDPI=" + densityDPI);   272 273 274 275    276 277 278 279 int screenWidthDip = dm.widthPixels;        // 屏幕宽(dip,如:320dip)   280 281 282 283 int screenHeightDip = dm.heightPixels;      // 屏幕宽(dip,如:533dip)   284 285 286 287    288 289 290 291 Log.e(TAG + "  DisplayMetrics(222)", "screenWidthDip=" + screenWidthDip + "; screenHeightDip=" + screenHeightDip);   292 293 294 295    296 297 298 299 screenWidth  = (int)(dm.widthPixels * density + 0.5f);      // 屏幕宽(px,如:480px)   300 301 302 303 screenHeight = (int)(dm.heightPixels * density + 0.5f);     // 屏幕高(px,如:800px)   304 305 306 307    308 309 310 311 Log.e(TAG + "  DisplayMetrics(222)", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);   312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 结果如下: 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 [java]  361 362 363 364 view plain 365 366 367 368 copy 369 370 371 372 print 373 374 375 376 ? 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 E/== MyScreenActivity ===================================  getDefaultDisplay( 8509): screenWidth=320; screenHeight=533   405 406 407 408 E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=156.3077; ydpi=157.51938   409 410 411 412 E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.0; densityDPI=160   413 414 415 416 E/== MyScreenActivity ===================================  DisplayMetrics(111)( 8509): screenWidth=320; screenHeight=533   417 418 419 420 E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=234.46153; ydpi=236.27907   421 422 423 424 E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.5; densityDPI=240   425 426 427 428 E/== MyScreenActivity ===================================  DisplayMetrics(222)( 8509): screenWidthDip=320; screenHeightDip=533   429 430 431 432 E/== MyScreenActivity ===================================  DisplayMetrics(222)( 8509): screenWidth=480; screenHeight=800   433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 分析结果:在onDraw()方法中方法12,得到的结果都一致,均为320*533,明显不是测试机i9000的屏幕大小方法3,将方法12得到的结果,乘以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 G14HTC 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. 449 测试源码 450 451原文:Android 获取屏幕尺寸与密度 Android的计量单位px,in,mm,pt,dp,dip,sp
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

移动端H5开发常用技巧总结

html篇常用的meta属性设置meta对于移动端的一些特殊属性,可根据需要自行设置<meta name"screenorientation" content"portrait" //Android 禁止屏幕旋转<meta name"fullscreen" content"yes"             //全屏显示

栅格布局xs sm md lg xl

1.单位xl对应屏幕1920px超大显示器lg对应屏幕1200px,小于1920px台式19201080显示器md对应屏幕992px,小于1200px适合笔记本sm对应屏幕768px,小于992px适合平板xs对应屏幕<768手机端屏幕例如有如下代码将屏幕分成3列,进行响应式布局当屏幕的大小变成手机般大小(屏幕宽度<768px)时只显示xs2