Android的px、dip、sp的区别
一、 概述
我们在页面布局的时候,经常会设置容器的长度,但是到底该使用哪个作为长度的单位而懊恼。
在Android中支持的描述大小区域的类型有以下几种。
px(pixels)——像素:不同的设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
dip(device independent pixels)——设备独立像素:这个和设备硬件有关,一般哦我们为了支持WCGA、HVGA和QVGA推荐使用这个,不依赖于像素。等同于dp。
dp(Density-independent pixel)是一个密度无关的像素单位,是用来表示基于160 dpi的设备计算出来的虚拟像素。
sp(scaled pixels—best for text size)——带比例的像素。
pt(points)——磅:1pt = 1/72英寸
in(inches)——英寸
mm(millimeters)——毫米
二、 详解
sp由于是放大像素,主要是用于字体显示,由此根据google的建议,TextView的字体大小最好用sp做单位,而且查看TextView的源码可知Android默认使用水平作为字号单位。
在Android中最常用到的还是px和dip。但是这两个之间到底有什么区别呢?
在HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120 density值表示每英寸有多少个显示点,与分辨率是两个概念。不同density下屏幕分辨率信息,以480dip*800dip的WVGA(density=240)为例。
density=120时 屏幕实际分辨率为240px*400px (两个点对应一个分辨率)
状态栏和标题栏高各19px或者25dip
横屏是屏幕宽度400px 或者800dip,工作区域高度211px或者480dip
竖屏时屏幕宽度240px或者480dip,工作区域高度381px或者775dip
density=160时 屏幕实际分辨率为320px*533px (3个点对应两个分辨率)
状态栏和标题栏高个25px或者25dip
横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者480dip
竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip
density=240时 屏幕实际分辨率为480px*800px (一个点对于一个分辨率)
状态栏和标题栏高个38px或者25dip
横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者480dip
竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip
apk的资源包中,当屏幕density=240时使用hdpi 标签的资源
当屏幕density=160时,使用mdpi标签的资源
当屏幕density=120时,使用ldpi标签的资源。
不加任何标签的资源是各种分辨率情况下共用的。
(组件类的相关方法却只能以像素为单位。例如,设置GridView组件类的列间距。这种情况下就涉及到了dip/dp与px之间的相互转换)
. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这 这个,不依赖像素。
这里要特别注意dip与屏幕密度有关,而屏幕密度又与具体的硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px,有时候可能你的屏幕分辨率很大如480*800,但是屏幕密度没有正确设置比如说还是160,那么这个时候凡是使用dip的都会显示异常,基本都是显示过小。public static int dip2px(Context context, float dipValue){
//scal 密度。
final float scale = context.getResources().getDisplayMetrics().density;}
dip 转 px 代码
int heightPx= DisplayUtil.dip2px(this, 33);
mTabHost.getTabWidget().getChildAt(i).getLayoutParams().height = heightPx
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
QVGA/WQVGA/HVGA/VGA/WVGA说的是手机屏幕不同的分辨率,他们之间的区别就是分辨率水平,表现出来的图像细腻度也不相同。
其中QVGA的全称是Quarter VGA,分辨率为240*320像素,一般比较老和新款低端的Windows Mobile机型采用这一分辨率;
WQVGA是QVGA的加强升级版Wide Quarter
VGA,可以看做是QVGA分辨率的加宽版本,分辨率达到了240*400像素,一般也是用在低端手机中;
HVGA的全称是Half VGA,分辨率为320*480像素,一般的中端Windows Mobile机型和较老的高端WM机型都采用这一分辨率。
VGA是最为标准的分辨率,这点从前面的介绍中就能够了解到,因为他们都是在VGA之前加了一个字母将改分辨率进行缩减。VGA分辨率为480*640像素,一般用在中端机型和较老的高端手机中;
最后的WVGA分辨率全称是Wide VGA,分辨率达到了480*800像素或者480*854(宽屏)像素,是目前最高端的Windows
Mobile手机使用的分辨率。众所周知目前HTC HD2是当之无愧的机皇,这款手机的分辨率就达到了WVGA级别。
一般手机液晶屏幕都是TFT材质,VGA WVGA QVGA HVGE XGA只是表示屏幕分辨率只,是个代号和材质没关系。
分辨率对照表:
代号 分辨率 代号 分辨率
QVGA 320*240像素 WQVGA 400*240像素
HVGA 320*480像素 VGA 640*480像素
WVGA 800*480像素 XGA 1024*480像素
QVGA 即Quarter VGA。顾名思义即VGA的四分之一尺寸
HVGA (Half-size VGA),即VGA(640*480)的一半
WVGA 即Wide VGA
WQVGA 全称:Wide Quarter Video Graphics Array
VGA 和XGA(Extended Graphics Array) 详情见百度百科
他们和屏幕大小也没关系,比如 诺基亚N95和诺基亚E71都是QVGA 320*240,N95是2.6英寸 N95 8GB为2.8英寸, 而E71是2.36英寸
再看,苹果iphone是HVGA 320*480 3.5英寸 而G3(HTC hero)也是HVGA 320*480 屏幕为3.2英寸。
当然同样的分辨率 屏幕越小 显示越细腻!
pt, px, DPI: 关于长度单位的误解
February 24th 2006 Posted to CSS, Browsers, Typography
在印刷排版中,“point”是一个绝对的单位,它等于 1/72 英寸,可以用尺子丈量的,物理的英寸。但在 CSS 中 pt
的含义却非如此,例如我们指定一个字体是 9pt,我们会以为按照 CSS 规范,它等于:
9 * 1/72 = 1/8 inch
这是一个误解,因为我们的显示器被分割为了一个个的像素,单个像素只能有一种颜色 (为了简化,这里暂不讨论次像素反锯齿技术),要在屏幕上显示,必须先把以 pt
为单位的长度转换为以像素为单位的长度,这个转换的媒介,就是 DPI (事实上,这里的所谓的 DPI,是操作系统和浏览器中使用的术语,即为 PPI, pixels
per inch,和扫描仪、打印机、数码相机中的 DPI 是不同的概念)。
例如,无论在哪个操作系统中,Firefox 浏览器默认的 DPI 都是 96,那么实际上 9pt = 9 * 1/72 * 96 = 12px。
所以,虽然“DPI”中的“I”和“1pt 等于 1/72 inch”中的“inch”,都不代表物理上的英寸,但这两个单位互相之间是相等的,也就在相乘中约掉了。
那么,真实的物理长度怎么计算呢?请拿出一把尺子,丈量你的显示器的可见宽度 (我这里是 11.2992 英寸),除以横向分辨率 (我这里是 1024
像素),得到的就是每个像素的物理长度。
现在我们可以回答这样一个问题,网页上 9pt 的字体究竟占用了多宽的空间?答案是:
9 * 1/72 * 96 * 11.2992 / 1024 = 0.1324 英寸 = 0.3363 厘米。
手机屏幕的2.1英寸只手机的矩形屏幕对角线的长度,用对角线长度来衡量手机屏幕的大小,当然英寸也能换算成厘米一英寸,也就是25.4毫米。
1像素
简单地说,一个像素可以看作一个点,这样的点是有尺寸有面积的,尺寸单位可以与厘米互化,公式我记不清了。照片就是由许多这样的点组成的。每个点记录对应的色彩信息。
30万像素就是分辨率640*480=307200个点的合成,这里的一个点就是一个指一个像素
2分辨率
分辨率。单说分辨率是不能反映出图片品质的,分辨率的意思是,单位尺寸的像素数。通常说的是每英寸的像素数,单位是dpi。例如分辨率是72dpi,也就是说每英寸有72个像素.相当于一条直线由无数点组成一样,这里就一英寸的线段由72个相素组成.
像素密度:像素总数/屏幕面积
android密度:160DPI密度系数是1