android dp dip sp px中dip,dp,sp,pt和px的区别

【转】Android的计量单位px,in,mm,pt,dp,dip,sp - 向前进 - ITeye博客
博客分类:
Historically, programmers always designed computer interfaces in terms of pixels. For example, you mightmake a field 300 pixels wide, allow 5 pixels of spacing between columns, and define icons 16-by-16 pixels in size. The problem is that if you run that program on new displays with more and more dots per inch (dpi), the user interface appears smaller and smaller. At some point, it becomes too hard to read. Resolution-independent measurements help solve this problem.Android supports all the following units:o px (pixels): Dots on the screen.o in (inches): Size as measured by a ruler.o mm (millimeters): Size as measured by a ruler.o pt (points): 1/72 of an inch.o dp (density-independent pixels): An abstract unit based on the density of the screen. On a display with 160 dots per inch, 1dp = 1px.o dip: Synonym for dp, used more often in Google examples.o sp (scale-independent pixels): Similar to dp but also scaled by the user’s font size preference.To make your interface scalable to any current and future type of display, I recommend you always use the sp unit for text sizes and the dip unit for everything else. You should also consider using vector graphics instead of bitmaps
如果英文不想看,看下面:
px:是屏幕的像素点
pt:磅,1/72 英寸
dp:一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px
dip:等同于dp
sp:同dp相似,但还会根据用户的字体大小偏好来缩放。
建议使用sp作为文本的单位,其它用dip
针对dip和px 的关系,做以下概述:
HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120density值表示每英寸有多少个显示点,与分辨率是两个概念。不同density下分辨率信息,以480dip*800dip的 WVGA(density=240)为例density=120时 屏幕实际分辨率为240px*400px (两个点对应一个分辨率)栏和标题栏高各19px或者25dip 横屏是屏幕宽度400px 或者800dip,工作区域高度211px或者480dip竖屏时屏幕宽度240px或者480dip,工作区域高度381px或者775dipdensity=160时 屏幕实际分辨率为320px*533px (3个点对应两个分辨率)状态栏和标题栏高个25px或者25dip 横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者480dip竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dipdensity=240时 屏幕实际分辨率为480px*800px (一个点对于一个分辨率)状态栏和标题栏高个38px或者25dip 横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者480dip竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dipapk的包中,当屏幕density=240时使用hdpi 标签的资源当屏幕density=160时,使用mdpi标签的资源当屏幕density=120时,使用ldpi标签的资源。不加任何标签的资源是各种分辨率情况下共用的。布局时尽量使用单位dip,少使用px
浏览: 19915 次
来自: 上海Android的计量单位in,mm,pt。px。dp/dip,sp - 温宗亮博客 - ITeye博客
in(英寸): 屏幕的物理尺寸, 每英寸等于2.54厘米。
mm(毫米): 屏幕的物理尺寸。
: 屏幕的物理尺寸。1/72英寸。
px(象素): 屏幕实际的象素,常说的分辨率pixels,就是横向1024px, 纵向768px,不同设备显示效果相同。
: 与密度无关的象素,一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。但dp和px的比例会随着屏幕密度的变化而改变,不同设备有不同的显示效果。
: 同dp相似,与刻度无关的象素,但还会根据用户的字体大小偏好来缩放。主要用于字体显示best for textsize,作
建议使用sp作为文本的单位,其它用dp
针对dp和px 的关系,做以下概述:
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,少使用px
wenzongliang
浏览: 224680 次
来自: 北京
我也遇到了同样的问题,addView第一次动态添加Surfac ...
你好,我想问一下jint qizi[size][col];
好精细的说明,学习
为什么我按照顺序做的,却报错啊,报错内容:java.secur ...
看了好多,启动模式介绍的,我感觉你写的是最通俗易懂的,很 ...Android中dip、dp、sp、pt和px的区别详解
字体:[ ] 类型:转载 时间:
本篇文章是对Android中dip、dp、sp、pt和px的区别进行了详细的分析介绍,需要的朋友参考下
1、概述过去,程序员通常以像素为单位设计计算机用户界面。例如:图片大小为80×32像素。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清内容。由此我们采用与分辨率无关的度量单位来开发程序就能够解决这个问题。Android应用开发支持不同的度量单位。
2、度量单位含义dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。 dp: dip是一样的px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。in(英寸):长度单位。 mm(毫米):长度单位。
3、度量单位的换算公式在android源码包TypedValue.java中,我们看如下函数: 代码如下:& public static float applyDimension(int unit, float value,&& DisplayMetrics metrics)&& {&switch (unit) {&case COMPLEX_UNIT_PX:&&&&&case COMPLEX_UNIT_DIP:&&&& return value * metrics.&case COMPLEX_UNIT_SP:&&&& return value * metrics.scaledD&case COMPLEX_UNIT_PT:&&&& return value * metrics.xdpi * (1.0f/72);&case COMPLEX_UNIT_IN:&&&& return value * metrics.&case COMPLEX_UNIT_MM:&&&& return value * metrics.xdpi * (1.0f/25.4f);&}&return 0;&&& }&&该函数功能:是把各单位换算为像素。&& metrics.density:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;&& metrics.scaledDensity:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;&& metrics.xdpi:默认值为DENSITY_DEVICE;&& DENSITY_DEVICE:为屏幕密度&& DENSITY_DEFAULT:默认值为1604、屏幕密度:表示每英寸有多少个显示点,与分辨率是两个不同的概念。Android主要有以下几种屏:如下表&&&&&
Range(inches)
目前android默认的low=120 ;Medium =160; High = 2405、综上所述&&& 据px = dip * density / 160,则当屏幕密度为160时,px = dip根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知Android默认使用sp作为字号单位。将dip作为其他元素的单位。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具android屏幕分辨率适配及dip、sp、pt、px等区别
android屏幕分辨率适配
多分辨率支持
  在设计之初,Android系统就被设计为一个可以在多种不同分辨率的设备上运行的操作系统。对于应用程序来说,系统平台向它们提供的是一个稳定的,跨平台的运行环境,而关于如何将程序以正确的方式显示到它所运行的平台上所需要的大部分技术细节,都由系统本身进行了处理,无需程序的干预。当然,系统本身也为程序提供了一系列API,所以在目标平台的分辨率是可以完全确定的情况下,程序也可以精确的控制自身在目标平台上的界面显示方式。
  这个文档会说明系统平台究竟提供了哪些分辨率支持特性,与它们如何在程序中使用的信息。如果你遵循文档中列出的方法,就很容易让你的程序在所有支持的分辨率下都能完美显示。这样你就可以用一个单独的.apk文件,将你的程序发布到所有的平台上。
  如果你已经发布过针对Android
1.5或更早版本平台的程序,你应该仔细阅读这篇文档,然后考虑一下到底如何让自己的老程序可以在拥有各种不同分辨率,并且运行着Android
1.6或更新平台上正常显示。在绝大部分情况下,只需要对程序作出小小的修改就可以达到目的,但你仍然需要尽可能地在各种分辨率的平台上进行测试。
  特别的,如果你有一个已经完成的程序,又想让它可以在超低分辨率的设备(比如320&240)上正确运行,你需要阅读“老程序的更新策略”,那篇文档会告诉你应该怎么做。
术语和概念1、屏幕尺寸
屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如2.8寸,3.5寸)。
简而言之,Android把所有的屏幕尺寸简化为三大类:大,正常,和小。
程序可以针对这三种尺寸的屏幕提供三种不同的布局方案,然后系统会负责把你的布局方案以合适的方式渲染到对应的屏幕上,这个过程是不需要程序员用代码来干预的。
2、屏幕长宽比
屏幕的物理长度与物理宽度的比例。程序可以为制定长宽比的屏幕提供制定的素材,只需要用系统提供的资源分类符long和notlong。
屏幕上拥有的像素的总数。注意,虽然大部分情况下分辨率都被表示为“宽度&长度”,但分辨率并不意味着屏幕长宽比。在Android系统中,程序一般并不直接处理分辨率。
& 以屏幕分辨率为基础,沿屏幕长宽方向排列的像素。
密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的屏幕通常则会有很多——甚至会非常非常多——像素排列在同一区域。屏幕的密度是非常重要的,举个例子,长宽以像素为单位定义的界面元素(比如一个按钮),在低密度的屏幕上会显得很大,但在高密度的屏幕上则会显得很小。
5、密度无关的像素(DIP)
指一个抽象意义上的像素,程序用它来定义界面元素。它作为一个与实际密度无关的单位,帮助程序员构建一个布局方案(界面元素的宽度,高度,位置)。
一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为160DPI的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度作为基准,“透明地”处理所有需要的DIP缩放操作。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式:pixels
= dips * (density /
160)。举个例子,在DPI为240的屏幕上,1个DIP等于1.5个物理像素。我们强烈推荐你用DIP来定义你程序的界面布局,因为这样可以保证你的UI在各种分辨率的屏幕上都可以正常显示。
支持的屏幕分辨率范围&&&
1.5及更早版本的Android系统,在设计的时候假定系统只会运行在一种分辨率的设备上——HVGA(320&480)分辨率,尺寸为3.2寸。由于系统只能工作在一种屏幕上,开发人员就可以针对那个屏幕来编写自己的程序,而无需去考虑程序在其他屏幕上的显示问题。
&&& 但自从Android
1.6以来,系统引入了对多种尺寸、多种分辨率屏幕的支持,以此满足拥有各种配置的新平台的运行需求。这就意味着开发人员在针对Android
1.6或更新版系统开发程序的时候,需要为自己的程序在多种分辨率的屏幕上良好显示作出额外的设计。
为了简化程序员面在对各种分辨率时的困扰,也为了具备各种分辨率的平台都可以直接运行这些程序,Android平台将所有的屏幕以密度和分辨率为分类方式,各自分成了三类:
·三种主要的尺寸:大,正常,小;
·三种不同的密度:高(hdpi),中(mdpi)和低(ldpi)。
如果需要的话,程序可以为各种尺寸的屏幕提供不同的资源(主要是布局),也可以为各种密度的屏幕提供不同的资源(主要是位图)。除此以外,程序不需要针对屏幕的尺寸或者密度作出任何额外的处理。在执行的时候,平台会根据屏幕本身的尺寸与密度特性,自动载入对应的资源,并把它们从逻辑像素(DIP,用于定义界面布局)转换成屏幕上的物理像素。
下表列出了Android平台支持的屏幕中一些比较常用的型号,并显示了系统是如何把它们分类到不同的屏幕配置里的。有些屏幕分辨率并不在下面的列表上,但系统仍会把它们归入下列的某一个类型中。
低密度(120),ldpi
中密度(160),mdpi
高密度(240),hdpi
·QVGA(240&320),2.6~3.0寸
·WQVGA(240&400),3.2~3.5寸
·FWQVGA(240&432),3.5~3.8寸
·HVGA(320&480),3.0~3.5寸
·WVGA(480&800),3.3~4.0寸
·FWVGA(480&854),3.5~4.0寸
·WVGA(480&800),4.8~5.5寸
·FWVGA(480&854),5.0~5.8寸
如上表所示,所有分辨率的屏幕,都围绕在基准屏幕周围,而基准屏幕在分类中,为“正常”尺寸,与“中”密度。之所以用HVGA屏幕作为基准屏幕,是因为所有针对Android
1.5或更早的程序都是针对这片屏幕所写的(因为只支持这一片),比如T-Mobile G1。
虽然系统支持上面9种不同配置的屏幕,但你并不一定需要为它们都提供各自不同的资源。系统已经提供了足够鲁棒(就是在各种恶劣环境下正常工作,对环境变化不敏感)的兼容特性,用于在各种不同的屏幕上良好显示你的程序。这在下面的文档中会详细描述,如果你需要更多的资料,请查看“与屏幕无关的最佳实践”。
作者“Ant space”(以上转自:)
dip, dp, px, sp区别
什么是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作为其他元素的单位。当然,也可以考虑使用矢量图形,而不是用位图。
(以上内容转自:
转载内容:)
dip: device independent pixels(设备独立像素).
不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
由此,根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知
Android 默认使用 sp 作为字号单位。
###################################################################
关于换算(以 sp 和 pt 为例)
查看 TextView 等类的源码,可知:
case COMPLEX_UNIT_PX:
case COMPLEX_UNIT_SP:
return value * metrics.scaledD
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 /
x = 160 / 72 = 2.2222
也就是说在 Android 中,& 1pt 大概等于 2.22sp
&& 以上供参考,如果 UI 能够以 sp
为单位提供设计是最好的,如果设计中没有 sp 的概念,则开发人员也可以通过适当的换算取近似值。
(以上转自:)
dip: device independent pixels(设备独立像素).&不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA
推荐使用这个,不依赖像素。
pixels(像素).&不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
scaled pixels(放大像素).&主要用于字体显示best
for textsize。由此,根据 google 的建议,TextView 的
字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp
作为字号单位。
& 在 Android
中,&&1pt 大概等于 2.22sp以上供参考,如果 UI
能够以 sp 为单位提供设计是最好的,如果设计中没有
sp的概念,则开发人员也可以通过适当的换算取近似值。
过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16&16像素
等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清
与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。
& px(像素):屏幕上的点。
& in(英寸):长度单位。
& mm(毫米):长度单位。
& pt(磅):1/72英寸。
& dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp =
& dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
& 分辨率:整个屏是多少点,比如800x480,它是对于软件来说的显示单位,以px为单位的点。
density(密度)值表示每英寸有多少个显示点,与分辨率是两个概念。apk的资源包中,&
当屏幕density=240时使用hdpi标签的资源&
当屏幕density=160时,使用mdpi标签的资源&
当屏幕density=120时,使用ldpi标签的资源。&
& 一般android设置长度和宽度多用dip,设置字体大小多用sp.
在屏幕密度为160,1dp=1px=1dip, 1pt = 160/72 sp 1pt = 1/72
英寸.当屏幕密度为240时,1dp=1dip=1.5px.
&&&为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip作为其他元素的单位。当然,也可以考虑使用矢量图形,而不是用位图。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Android中px、sp、dip的区别
刚刚接触android开发的同学,在做UI开发的时候都会碰到各种度量单位----px, dp, sp,网上有很多文章讲述这三者的不同,当初我刚开始接触android开发的时候,正是通过网上的这些资料了解他们的区别的,但是看完之后仍然不是很明了的感觉,究其原因,是因为大部分文章都是从“其然”的角度来阐述的,让读者不知其所以然。本文试图从android实现的角度来阐述这三者的区别。
不管我们开发者使用哪个度量单位,最后经过android的处理,都是要转换成像素单位的,也就是px。而在android中,负责实现这一转换过程的函数如下:
// TypedValue 中的这个函数负责将dp,sp,px等维度信息转换成像素
public static int complexToDimensionPixelSize(int data,
DisplayMetrics metrics)
final float value = complexToFloat(data);
final float f = applyDimension(
(data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,
// 这个函数负责完成转换,其实现请往下看
final int res = (int)(f+0.5f);
// 这里做了一个四舍五入
if (res != 0)
if (value == 0) return 0;
if (value > 0) return 1;
return -1;
// 从这个函数的实现可以看出android系统对dp和sp处理的区别
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
switch (unit) {
case COMPLEX_UNIT_PX:
// px不需要做转换
case COMPLEX_UNIT_DIP:
return value * metrics.
// dp转换成px
case COMPLEX_UNIT_SP:
return value * metrics.scaledD
// sp转换成px
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
看完上述两个函数,有一定基础的同学相信已经一目了然,不过这里我还是做一下详细介绍:
1、 DisplayMetrics是一个封装了屏幕属性的数据结构,其中有屏幕的高度、宽度、dpi(每英寸像素个数)、已及
上面函数中用到的density、scaledDensity等信息;
2、 特定机型的density是确定的,其取值取决于dpi,
如果dpi == 160, 则density = 1;
如果dpi == 120, 则density = 0.75;
如果dpi = 320, 则density = 2;
依次类推,也就是说
density = (dpi*1.0)/ 160;
3、至于scaleDensity, android中的解释如下:
* A scaling factor for fonts displayed on the display.
This is the same
* as {@link #density}, except that it may be adjusted in smaller
* increments at runtime based on a user preference for the font size.
public float scaledD
也就是说,这个属性基本和density属性一样,唯一不同的地方是density对于特定机型是确定的,是不会变化的,
而scaleDensity是运行时确定的,是会跟这用户设置的偏好字体大小变化的。
4、至此,我们就基本明白了sp和dp的区别,在很多android书籍中,都会说到如果是字体的大小开发者应该使
用sp作为单位,甚至android官方文档也这么说,我认为这纯属是在误导人,因为sp是运行时确定的,字体大小
在运行时确定是有可能引发布局混乱的。如果想得到不管用户如何设置偏好字体大小,我们开发的应用的字体大
小都不变就应该使用dp,而不是sp。
5、我们在开发过程中,经常需要用到这些度量单位的转换,其实理解这些单位之间的区别以及android对这些单
位的转换之后,要实现转换函数是很简单的了
public static final int dp2px(float dp, Resources res)
return (int) (dp * res.getDisplayMetrics().density + 0.5f);
public static final int sp2px(float sp, Resources res)
return (int) (sp * res.getDisplayMetrics().scaledDensity+ 0.5f);}

我要回帖

更多关于 android dp dip sp px 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信