dip dp px sp

Android的px、dip、sp的区别

一、       概述

我们在页面布局的时候,经常会设置容器的长度,但是到底该使用哪个作为长度的单位而懊恼。

在Android中支持的描述大小区域的类型有以下几种。

px(pixels)——像素:不同的设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。

dip(device independent pixels)——设备独立像素:这个和设备硬件有关,一般哦我们为了支持WCGA、HVGA和QVGA推荐使用这个,不依赖于像素。等同于dp。

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标签的资源。
不加任何标签的资源是各种分辨率情况下共用的。



. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这    这个,不依赖像素。

    这里要特别注意dip与屏幕密度有关,而屏幕密度又与具体的硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px,有时候可能你的屏幕分辨率很大如480*800,但是屏幕密度没有正确设置比如说还是160,那么这个时候凡是使用dip的都会显示异常,基本都是显示过小。 
     dip的换算: 
           dip(value)=(int) (px(value)/1.5 + 0.5) 
. dp: 很简单,和dip是一样的。 
. px: pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变。 
.  sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。 

备注: 根据google的推荐,像素统一使用dip,字体统一使用sp   
举个例子区别px和dip:
px就是像素,如果用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。
而dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。

public static int dip2px(Context context, float dipValue){ 

               //scal  密度。

                final float scale = context.getResources().getDisplayMetrics().density; 
                return (int)(dipValue * scale + 0.5f); 
        } 
        
    public static int px2dip(Context context, float pxValue){ 
                final float scale = context.getResources().getDisplayMetrics().density; 
                return (int)(pxValue / scale + 0.5f); 

        }

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


[ dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。 

px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。 

pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用; 

sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。 

=========================

关于换算(以 sp 和 pt 为例) 
查看 TextView 等类的源码,可知: 

case COMPLEX_UNIT_PX: 
return value; 
case COMPLEX_UNIT_SP: 
return value * metrics.scaledDensity; 
case COMPLEX_UNIT_PT: 
return value * metrics.xdpi * (1.0f/72); 

-------------------------- 
scaledDensity = DENSITY_DEVICE / (float) DENSITY_DEFAULT; 
xdpi = DENSITY_DEVICE; 

-------------------------- 
DENSITY_DEFAULT = DENSITY_MEDIUM = 160; 

============================================ 
所以: 假设 pt 和 sp 取相同的值 1,则可设 1pt 和 1sp 之间系数为 x, 

1 * DENSITY_DEVICE / 72 = x * 1 * DENSITY_DEVICE / 160 => 
x = 160 / 72 = 2.2222 

也就是说在 Android 中, 1pt 大概等于 2.22sp 

===================================================================
什么是Dip和Sp 

过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。 

与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。 

px(像素):屏幕上的点。 

in(英寸):长度单位。 

mm(毫米):长度单位。 

pt(磅):1/72英寸。 

dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。 

dip:与dp相同,多用于android/ophone示例中。 

sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。 

为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip作为其他元素的单位。当然,也可以考虑使用矢量图形,而不是用位图

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值