首先来了解一下几个概念
Screen size 屏幕尺寸
实际的物理尺寸,是根据屏幕的对角线计量的。比如说Iphone4是3.5英寸的屏幕,就是说它的屏幕对角线长。1英寸大约等于25.4毫米。后面提到的尺寸单位Points等于一英寸的1/72。
为了简单起见,Android将所有的实际屏幕尺寸划分为4种广义的尺寸:small, normal, large, 和 extra large。
Screen density 屏幕密度
在屏幕上的物理区域中的像素数量,通常简单的以dpi(dots per inch 每英寸的点数)指代。例如,一个低分辨率的屏幕在同样的物理区域中的像素数肯定比中分辨率或者高分辨率的屏幕少。
为了简单起见,Android将所有的实际屏幕密度划分为四个广义的密度:low, medium, high, 和 extra high。
下图是Android对屏幕尺寸和屏幕密度的划分:
Resolution 分辨率
屏幕物理像素总数。比如三星Rugby III:其分辨率为240×320像素。240×320像素的意思就是,手机屏幕横向每行有240个像素点,纵向每列有320个像素点,乘起来就是320×240=76800个像素点。
Dimension尺寸
XML中定义的尺寸值。一个尺寸值就是带有尺寸单位的数值,例如:10px、2in、5sp。以下是Android中支持的尺寸单位:
dp
Density-independent Pixels 密度无关像素-基于屏幕的物理密度的一个抽象单位。这个尺寸单位是以160dpi(dots per inch 每英寸的点数)的屏幕为基准的,也就是说在这样的的屏幕上,1dp大约等于1px。在更高密度的屏幕上,用来表示1dp的像素数目就会按比例(根据屏幕dpi确定的适当的因数)增加;同样的,在一个低密度的屏幕上,用来表示1dp的像素数就会按比例减少。表示1dp的像素数会根据屏幕的密度而变化,但并不一定成正比。使用dp代替px作为尺寸单位,是一个简单的解决方案,它使在不同密度设备上的布局文件中的View适当的调整大小。换句话说,它使不同设备上的UI元素在现实世界中的尺寸保持一致性。
sp
Scale-independent Pixels 比例无关像素-类似于dp,但是也会受用户对字体大小的设置的影响。它被推荐用于设置字体大小,这样字体的实际显示效果会根据屏幕的密度和用户对字体大小的设置来调整。
pt
Points 点-基于屏幕的物理大小(physical size),等于一英寸的1/72。
px
Pixels 像素-就是屏幕的实际像素。不同设备每英寸中的像素数目可能不同,因而不同设备的总的像素数有的多,有的少。所以不推荐使用这个尺寸单位,因为不同的设备的实际表现不同。
mm
Millimeters 毫米-基于屏幕的物理大小(physical size)。
in
Inches 英寸-基于屏幕的物理大小(physical size)。
总之,sp用来设置字体大小,其他都使用dp就对了。
更多的讨论详见http://blog.csdn.net/welovesunflower/article/details/7930248
注意
一个尺寸资源是一个简单资源,也就是说它是根据指定的name属性的值来应用的(而不是含有它的XML文件的名字)。因此,你可以将尺寸资源同其他的简单资源放在同一个XML文件的<resources> 元素下。
res/values/filename.xml
The filename is arbitrary. The
<dimen>
element's name
will be used as the resource ID.R.dimen.dimension_name
In XML:
@[package:]dimen/dimension_name
<?xml version="1.0" encoding="utf-8"?><resources> <dimen name="dimension_name" >dimension</dimen></resources>
res/values/dimens.xml
:<?xml version="1.0" encoding="utf-8"?><resources> <dimen name="textview_height">25dp</dimen> <dimen name="textview_width">150dp</dimen> <dimen name="ball_radius">30dp</dimen> <dimen name="font_size">16sp</dimen></resources>
This application code retrieves a dimension:
Resources res =getResources()
;float fontSize = res.getDimension
(R.dimen.font_size);
This layout XML applies dimensions to attributes:
<TextView android:layout_height="@dimen/textview_height" android:layout_width="@dimen/textview_width" android:textSize="@dimen/font_size"/>