当指定Android用户界面上元素的大小时,应知道以下度量单位:
dp——与密度无关的像素(density-independent pixel)。1dp相当于160dpi的屏幕上的1像素。当在布局中指定视图尺寸时,推荐将dp作为度量单位。160dpi是Android假定的基准密度。当指的是与密度无关的像素时,可以使用dp或dip。
sp——与比例无关的像素(scale-independent pixel)。与dp类似,推荐用于指定字体大小。
pt——磅。1磅等于1/72英寸(基于屏幕的物理尺寸)。
px——像素。对应于屏幕上的实际像素。不建议使用这一单位,因为您的用户界面在不同屏幕尺寸的设备上可能不能正确呈现。
Android定义并可识别4种屏幕密度:
低密度(ldpi)——120dpi
中等密度(mdpi)——160dpi
高密度(hdpi)——240dpi
超高密度(xhdpi) ——320dpi
例如:
Nexus S的屏幕,它有一个4英寸的屏幕(按对角线计算),屏幕宽度为2.04英寸。它的分辨率为480(宽度)x800(高度)像素。将480像素分布到2.04英寸的宽度上,结果就是像素密度大约为235dpi。
使用dp单位确保了无论屏幕密度如何,视图总是会以正确的比例显示,这是因为Android会根据屏幕的密度自动缩放视图的尺寸。以Button为例。如果它在一个180dpi的屏幕上显示(180dpi的屏幕会被当做160dpi的屏幕进行处理),则宽度将是160像素。但是,如果在一个235dpi的屏幕上显示(235dpi的屏幕会被当做240dpi的屏幕处理),那么宽度将是240像素。
如何将dp转换为px?
将dp转换为px(像素)的公式如下:
实际像素=dp*(dpi/160),其中dpi可以是120、160、240或320。
因此,当Button显示在一个235dpi屏幕上时,其实际宽度是160*(240/160)=240px。当运行在180dpi的模拟器中(被视为160dpi的设备)时,其实际像素则是160*(160/160)=160px。
为了证明这是正确的,可以使用View对象的getWidth()方法获得其以像素表示的宽度:
public void onClick(View view) { Toast.makeText(this, String.valueOf(view.getWidth())), Toast.LENGTH_LONG).show(); }