1.px (pixels)(像素):是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px会比较多。通常不推荐使用这个。

2.dip或dp(与密度无关的像素):一个基于density的抽象单位,这个和设备硬件有关,通常在开发中设置一些view的宽高推荐用这个,一般情况下,在不同分辨率,都不会有缩放的感觉。在运行时, Android根据使用中的屏幕的实际密度, 透明地处理任何所需dip单位的缩放。
3.sp(与刻度无关的像素):同dip/dp相似,会根据用户的字体大小偏好来缩放,主要用于设置字体的大小。

可能很多朋友对dip和px 的区别,不是很清楚,包括我自己之前都没弄清楚,下面简单讨论一下:
首先明确一点:

HVGA屏density=160;QVGA屏density=120;

WVGA屏density=240;WQVGA屏density=120

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

dip到px的转换公式: px = dip * (density / 160)

Android官方定义dip等价于160dpi屏幕下的一个物理像素点, 即1dip=1px。举例来说, 在 240 dpi 的屏幕上, 1dip 等于 1.5px。

不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例:
    1.当density=120时屏幕实际分辨率为240px*400px (两个点对应一个分辨率)状态栏和标题栏高为19px或者25dip。
横屏时屏幕宽度为400px或者800dip,工作区域高度211px或者455dip;
竖屏时屏幕宽度为240px或者480dip,工作区域高度381px或者775dip。
    2.当density=160时屏幕实际分辨率为320px*533px (3个点对应两个分辨率)状态栏和标题栏高为25px或者25dip。
横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者455dip;
竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip。
    3.当density=240时屏幕实际分辨率为480px*800px (一个点对于一个分辨率)状态栏和标题栏高为38px或者25dip。
横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者455dip;
竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip。

在Android的应用包apk中,系统会根据各个设备的具体情况引用相应的资源文件(注:不加任何标签的资源是各种分辨率情况下共用的):

当屏幕density=240时,使用hdpi标签的资源;
当屏幕density=160时,使用mdpi标签的资源;
当屏幕density=120时,使用ldpi标签的资源。

下面是在manifest中设置app在不同分辨率时,是否支持多密度的方法。

...
<supports-screens
     android:smallScreens="true"
     android:normalScreens="true"
     android:largeScreens="true"
     android:xlargeScreens="true"
     android:anyDensity="true" />

...

附:
系统对屏幕大小和密度分类对照图 :

表 1. Android SDK中包含的模拟器皮肤的屏幕尺寸和密度,以及其他典型的分辨率.

  Low density (120), ldpi Medium density (160), mdpi High density (240), hdpi Extra high density (320), xhdpi
Small screen QVGA (240x320)   480x640  
Normal screen WQVGA400 (240x400) 
WQVGA432 (240x432)
HVGA (320x480) WVGA800 (480x800) 
WVGA854 (480x854) 
600x1024
640x960
Large screen WVGA800** (480x800) 
WVGA854** (480x854)
WVGA800* (480x800) 
WVGA854* (480x854) 
600x1024
   
Extra Large screen 1024x600 WXGA (1280x800)†
1024x768
1280x768
1536x1152
1920x1152 
1920x1200
2048x1536
2560x1536 
2560x1600

* 要模拟此配置, 使用WVGA800 或 WVGA854创建一个AVD, 指定自定义密度160.
** 要模拟此配置, 使用WVGA800 或 WVGA854创建一个AVD, 指定自定义密度120.

辅助工具类:

import android.content.Context;

public class DensityUtil {

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.getResources().getDisplayMetrics().density;

return (int) (pxValue / scale + 0.5f);

}

}

Android屏幕计量单位详解的更多相关文章

  1. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

  2. Android屏幕适应详解(二)

    android应用自适应多分辨率的解决方法 1. 首先是建立多个layout文件夹(drawable也一样).  在res目录下建立多个layout文件夹,文件夹名称为layout-800x480等. ...

  3. Android屏幕适应详解(一)

    一.关于布局适配 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_parent . 3.能够使用权重的地方尽量使用权重(android:layout_weight) 4.如 ...

  4. Android屏幕分辨率详解(VGA、HVGA、QVGA、WVGA、WQVGA)

    这些术语都是指屏幕的分辨率. VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素: HVGA:Half-size VGA:即:VGA的一半,分辨率为480× ...

  5. Android GLSurfaceView用法详解(二)

    输入如何处理       若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件.下面有个例子: java代码: package eoe.ClearTes ...

  6. Android 自定义 View 详解

    View 的绘制系列文章: Android View 绘制流程之 DecorView 与 ViewRootImpl Android View 的绘制流程之 Measure 过程详解 (一) Andro ...

  7. android:ToolBar详解

    android:ToolBar详解(手把手教程) 泡在网上的日子 发表于 2014-11-18 12:49 第 124857 次阅读 ToolBar 42 来源 http://blog.mosil.b ...

  8. Android之canvas详解

    首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...

  9. 【转】Android Canvas绘图详解(图文)

    转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文) 泡 ...

随机推荐

  1. JProfiler 5.1.4的使用方法

    1. JProfiler运行环境配置 安装目录结构如下,子目录中显示了支持的操作系统: 在服务器和客户端都要安装JProfiler,并且要安装License,在分析工具客户端中进行安装.Windows ...

  2. Current limiter allows large USB bypass capacitance

    The USB (Universal Serial Bus) specification requires a connected USB device to present a load to th ...

  3. The Eclipse runtime options

    Version 3.6 - Last revised August 5, 2009 The Eclipse platform is highly configurable. Configuration ...

  4. Mysql字符串连接函数 CONCAT()与 CONCAT_WS()

    从数据库里取N个字段,然后组合到一起用“,”分割显示,起初想到用CONCAT()来处理,好是麻烦,没想到在手册里居然有提到 CONCAT_WS(),非常好用. CONCAT_WS(separator, ...

  5. change kernel defconfig

    make -C kernel/goldfish O=/media/linux/1/touch/export/phablet-ubuntu-20130618/out/target/product/gen ...

  6. directio mysql 编绎选项

    http://www.myexception.cn/linux-unix/495407.html http://www.iyunv.com/thread-25950-1-1.html

  7. OpenShift 如何获取bearer Token以便进行各种API调用

    Openshift 需要通过bearer token的方式和API进行调用,比如基于Postman就可以了解到,输入bearer token后 1.如何获取Bearer Token 但Bearer T ...

  8. AlphaGo:用机器学习技术古老的围棋游戏掌握AlphaGo: Mastering the ancient game of Go with Machine Learning

    AlphaGo: Mastering the ancient game of Go with Machine Learning Posted by David Silver and Demis Has ...

  9. jenkins双向备份;高可用部署;

    如果把一个Jenkins的整个目录赋值到另一个Jenkins的目录,则需要务必保持两个Jenkins版本是相同的,不然容易出现Jenkins插件兼容性问题. 另外使用inotify+rsync备份的时 ...

  10. Node.js:Buffer(缓冲区)介绍及常用方法

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...