Android在UI布局时经常用到一些单位,对单位混用直接会影响UI的显示,要想正确的在布局中使用每种单位就必须先真正的熟悉它。
UI显示效果的影响因素:屏幕尺寸、屏幕密度、分辨率;而android手机种类又比较多,为了适应不同的设备,我们就要注意drawable和layout资源。
常用的单位有:px、dip(dp)、sp,还要一些不常用的单位,如pt、in、mm。
px:对应屏幕上的实际像素点;
dip(dp):设备独立像素,一种基于屏幕密度的抽象单位,在每英寸160点得显示器上,1dip=1px,但随着屏幕密度的改变,dip与px的换算会发生改变。因为不通设备中有不同的显示效果,所以为了解决在不通分辨率手机上运行不至于相差太大的问题,引入了dip计量单位,这种计量单位与移动设备硬件无关。
sp:全名 scaled pixels-best for text size,放大像素(比例像素),与刻度无关,可以根据用户的字体大小首选项进行缩放,主要用来处理字体的大小;
in:英寸(长度单位);
mm:毫米(长度单位);
pt:磅/点,标准的长度单位 ,1/72英寸;
px和dp的换算公式:
px = dp * (density/160)
density 是屏幕密度,表示每英寸有多少个显示点,与分辨率不同.
例如,
在density=240,800px*480px屏幕上,320dp的宽度对应的像素是480px;
在density=160,800px*480px屏幕上,320dp的宽度对应的像素是320px,
所以,
使用dp(sp)能够保证显示质量,但不保证显示尺寸比例;
相反,使用px能够保证显示尺寸比例,但不保证显示效果。
注意:在160dpi屏幕上,px和dp是等价的。
在布局中应该尽量使用dip(dp)作为单位;而定义作为文字大小的单位则推荐使用sp。
drawable资源对布局的影响
手机密度值(Density)表示每英寸有多少个显示点,与手机的分辨率是两个概念,但是分辨率与密度之间又互相关联,两者转换公式为:
密度值是120,屏幕实际分辨率为:240px×400px(两个点对应一个分辨率);
密度值是160,屏幕实际分辨率为:320px×533px(3个点对应两个分辨率);
密度值是240,屏幕实际分辨率为:480px×800px(一个点对应一个分辨率)。
比如,QVGA与WQVGA屏的密度值是120,HVGA屏密度值是160,WVGA屏密度值是240.
res资源目录,因为运行的设备的不同,对应的资源文件目录也不同。其真正的原因是,资源目录是根据密度的不同来进行划分的:
密度值是120,对应的资源目录是drawable-ldpi;
密度值是160,对应的资源目录是drawable-mdpi;
密度值是240,对应的资源目录是drawable-hdpi。
android中的不同资源规格对应的屏幕密度:
hdpi = 240 , 状态栏和标题栏高各19px或者25dip
mdpi = 160 , 状态栏和标题栏高各25px或者25dip
ldpi = 120 , 状态栏和标题栏高各38px或者25dip
系统会根据设备的屏幕密度来选择hdpi, mdpi, ldpi相应的资源,如果没有加标签,则默认为mdpi。
图片资源的放置位置直接影响图片最终显示的大小:
例如drawable-hdpi没有图片,假如现在有一张图片10x10的a.png放在drawable-mdpi,设备屏幕密度为240dpi。
如果在layout描述该图片时使用wrap_content,那么最后图片显示的大小就变成15x15。这是因为系统在drawable-hdpii找不到图片,就在drawable-mdpi找,找到a.png后,根据密度不同,系统自动对图片进行调整,所以就变成了15x15。假如drawable-hdpi有a.png,则不加处理根据其图片大小10x10显示。当然,如果在layout描述该图片时声明宽高都为10px,那么系统无论在什么文件夹下找到图片一般不会影响图片的显示大小(在SeekBar等容器就算指定大小也有可能改变)。
注:部分段落属于摘抄。