Android Density

1. 什么是 density

  1. density
    density 表示每英寸有多少个显示点 (逻辑值),它的单位是 dpi:dot per inch,通常屏幕大时,

density 就大,屏幕小时,density 就小,通常
屏幕实际分辨率为 240px400px 时,density=120
屏幕实际分辨率为 320px
533px,density=160
屏幕实际分辨率为 480px*800px,density=240

  1. 分辨率
    是整个屏是多少点,比如 800x480,它是软件的显示单位

  2. 从 Android1.6 版本开始支持 density(对应 API Level 4)
    用于解决应用在屏幕大小不同的硬件上正常显示的问题

2. 相关代码及设置

  1. AndroidManifest.xml

这个参数在 API Level 4 也就是 SDK 1.6 以后才启用的,而且 1.6 版本的 API Level 4 的应用默认值就是

True

  1. 资源目录名(android 2.0 以后) res/xxx-hdpi 当 density 为 240 时,使用此目录下的资源
    res/xxx-mdpi 当 density 为 160 时,使用此目录下的资源
    res/xxx-ldpi 当 density 为 120 时,使用此目录下的资源
    res/xxx 不常后缀,为默认设置,同 xxx-mdpi

  2. 资源单位(xml 文件中定义大小的单位)

  1. dp=dip=dx (** Density independent pixel **)
    基于屏幕密度的抽象单位,设备无关的点,用于说明与密度无关的尺寸和位置。这些单位是相对于一个 160dpi 的屏幕,所有一个 dp 是 160dpi

屏幕上的一个点。

  1. px
    px 指软件的单位点,设备相关的点

  2. 具体使用

  1. 布局时尽量使用单位 dip,少使用 px
    若使用 px,如果设某控件大小 400x400px,在 800x480 上显示正常,而在 533x320 的屏上就超出屏幕了
    若使用 dp,如果设某控件大小为 160x160dp,就可以通过从系统中取 density 来算出真正的大小,比如在 800x480

屏的 density 设为 240,而 533x320 屏的 density 设为 160,借以下公式计算
pixels = dips * (density / 160)
在 800x480 在屏中显示 240 象素,而在 533x320 的屏中显示为 160 象素,控件在屏中显示的比例是一样的。

  1. 内部的处理过程分为三步: 取 screen 中其它元素,转为应用的值,计算应用各控件位置,然后再转成 800x480 以供真正显示
    若 res-xxx 不存在,则读取 res 有的资源,然后对其做相应缩放

3. 实现 density 的关键源码

  1. BitmapFactory.java(用于缩放图片)

  2. ComptibilityInfo.java(用于位置计算)

(转载请注明作者及出处 http://xy0811.spaces.live.com/

)