Android尺寸dp,px,pt,sp

感谢 http://blog.sina.com.cn/s/blog_6b26569e0100xw6d.html

(一)概念

dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGAHVGAQVGA 推荐使用这个,不依赖像素。
px: pixels(
像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point
,是一个标准的长度单位,1pt1/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


(三)关系与区别

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

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

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

in(英寸):长度单位。

mm(毫米):长度单位。

pt(磅):1/72英寸。

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

dip:与dp相同,多用于android/ophone示例中。
sp
(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。

()建议

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

 

基本单位:
  px:
像素,是屏幕上显示数据的最基本的点。
  dp(dip)
:一种基于屏幕密度的抽象单位(与密度无关的像素)。
  dpi(dots per inch):
每英寸所显示的点数(像素),也可称为像素密度。
  pt
(磅):是一个标准的长度单位,1pt1/72英寸,用于印刷业,非常简单易用。
  sp
(与刻度无关的像素):scaled pixels(放大像素). 主要用于字体显示best for textsizeTextView 的字号可使用 sp 做单位。

屏幕尺寸Screen size
即显示屏幕的实际大小,按照屏幕的对角线进行测量。
为简单起见,Android把所有的屏幕大小分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).
应用程序可以为这四种尺寸分别提供不同的自定义屏幕布局-平台将根据屏幕实际尺寸选择对应布局进行渲染,这种选择对于程序侧是透明的。



密度Density
根据像素分辨率,在屏幕指定物理宽高范围内能显示的像素数量。
在同样的宽高区域,低密度的显示屏能显示的像素较少,而高密度的显示屏则能显示更多的像素。
屏幕密度非常重要,因为其它条件不变的情况下,一共宽高固定的UI组件(比如一个按钮)在在低密度的显示屏上显得很大,而在高密度显示屏上看起来就很小。
为简单起见,Android把所有的屏幕分辨率也分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).
应用程序可以为这四种尺寸分别提供不同的资源-平台将透明的对资源进行缩放以适配指定的屏幕分辨率。

 

获取屏幕的分辨率
Android 
提供 DisplayMetircs类可以很方便的获取分辨率,它提供了一种关于显示的通用信息,如显示大小,分辨率和字体。 
为了获取DisplayMetrics  成员,首先初始化一个对象如下:
 

DisplayMetrics metrics 
new DisplayMetrics();  
WindowManager WM = (WindowManager)mcontext.getSystemService(Context.WINDOW_SERVICE);
WM.getDefaultDisplay().getMetrics(metrics);

//
屏幕的分辨率

int width = dm.widthPixels() ; 
int height = dm.heightPixels();

注:构造函数DisplayMetrics  不需要传递任何参数;获得WindowManager 之后, getDefaultDisplay()  方法将取得的默认的显示信息,返回的是一个Display 对象,此对象的getMetrics(Metrics metrics)方法把分辨率信息传到 DisplayMetrics  对象中。

通过  DisplayMetrics.toString()方法可以获取到  DisplayMetrics的大部分信息,以下是模拟器上不同分辨率所有对应的信息: 

QVGA : {density=0.75, width=240, height=320, scaledDensity=0.75, xdpi=120.0, ydpi=120.0}
HVGA :  {density=1.0, width=320, height=480, scaledDensity=1.0, 
xdpi=160.0, ydpi=160.0
}
WVGA : {density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=240.0, ydpi=240.0}

其中,density为显示的逻辑分辨率;widthheight就为屏幕分辨率(为绝对宽度与高度),与fields中的widthPixels heightPixels一致;scaleDensitydensity一致;xdpiydpix方向与y方向的像素密度



如何计算密度(dpi
1.
标准是240*320画在1.5*2平方inch上。那么像每平方英寸有240*320/(1.5*2)=25600点,也就是一平方英寸的像素点为25600,所以dpi取为它的平方根160;如果你的dpi120,那么它的密度就是0.75.
2.
密度不只是与width有关,还与height有关,所以不管width1.8还是1.3,它的密度都有可能是1;比如width1.8,只要它的height3/1.8的话,如果pixel240*320的话,它的密度仍旧是1;同样如果width1.3,只要它的 height3/1.3的话,像素点为240*320,则密度也是
1.
3.320*480/(1.5*2)
得到单位平方英寸的点为51200,所以单位平方英寸是240*320画在1.5*2屏幕的2倍。但是这是平方英寸啊,算密度的时候要开平方的啊,所以应该是2开平方,是1.414吧,大致密度为1.5



pxdip的关系:
Android
中,在160dpi (mdpi)中, 1 dip= 1 px;
以此类推,在120dpildpi)中,
1 dip = 0.75px;
                 
240dpi (hdpi)中,
  1 dip = 1.5px;
                 
320dpixhdpi)中, 1dip = 2px



如何做到与密度无关:
  如果屏幕密度为160,这时dpsppx是一样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。那么原来TextView的宽度设成160px,在密度为3203.2 寸屏幕里看要比在密度为1603.2寸屏幕上看短了一半。但如果设置成160dp160sp的话。系统会自动将width属性值设置成320px的。也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dpsp,系统会根据屏幕密度的变化自动进行转换。官方文档总结的计算公式为:pixels = dps * (density /160).
使用dip作为View的单位,这样就可以同时兼容各种不同的分辨率,不会造成UI的不可兼容。



使用dip作为控件的大小单位:
     1.
布局文件:
       
如果使用布局文件的形式定义控件,可直接在 android:layout_width android:layout_height 中使用dip作为单位,来定义View的大  小,如下:
        <TextView android:layout_width="50dip" android:layout_height="50dip"></TextView>

    2.
代码形式:
      
如果是自定义的View控件,那么可能使用的是代码的形式来布局,比如:
        MyTextView myTextView = new MyTextView(this);
       
可以调用myTextView.setWidth() setHeight()来设置View宽度和高度,但是这两个方法接收的是以像素单位的值,也就说,如果要用代码的形式来以dip为单位设置View大小,则需要先将dip转换为px

       
这里可以使用如下方法,如下:


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

 
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density ;
return (int) (dpValue * scale + 0.5f) ;
 }
 dip数值转换为px后,在调用setWidth() setHeight()来设置View宽度和高度。

 

 
默认的控件大小:

当在屏幕为160dpi,也就是density1的情况下,所得到的控件的宽度和高度为android控件的默认的dip大小。
比如:Button 默认高度为 48dip
状态栏的默认高度为25dip
 

 
 
总结:对于UI布局,要使用dip或者dp作为单位,对应字体要是有sp作为单位,要尽量少使用px作为单位。

 

【转载】Android dip,px,pt,sp 的区别

       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 作为字号单位。

       在 Android 中,  1pt 大概等于 2.22sp以上供参考,如果 UI 能够以 sp 为单位提供设计是最好的,如果设计中没有 sp的概念,则开发人员也可以通过适当的换算取近似值。

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

       与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。
       px(像素):屏幕上的点。
       in(英寸):长度单位。
       mm(毫米):长度单位。
       pt(磅):1/72英寸。
       dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
       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, 屏幕分辨率, 屏幕方向, 字体大小, dip, px, pt, sp

 

android中dip、dp、px、sp和屏幕密度详解

 

1. 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)
2. dp: 很简单,和dip是一样的。

3. px: pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变。

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

 

备注: 根据google的推荐,像素统一使用dip,字体统一使用sp
举个例子区别px和dip:

px就是像素,如果用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。
而dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。

附上通用转换Code:

[java] view plaincopyprint?

1.  /** 

2.   * dp、sp 转换为 px 的工具类 

3.   *  

4.   */  

5.  public class DisplayUtil {  

6.      /** 

7.       * 将px值转换为dip或dp值,保证尺寸大小不变 

8.       *  

9.       * @param pxValue 

10.      * @param scale 

11.      *            (DisplayMetrics类中属性density) 

12.      * @return 

13.      */  

14.     public static int px2dip(Context context, float pxValue) {  

15.         final float scale = context.getResources().getDisplayMetrics().density;  

16.         return (int) (pxValue / scale + 0.5f);  

17.     }  

18.   

19.     /** 

20.      * 将dip或dp值转换为px值,保证尺寸大小不变 

21.      *  

22.      * @param dipValue 

23.      * @param scale 

24.      *            (DisplayMetrics类中属性density) 

25.      * @return 

26.      */  

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

28.         final float scale = context.getResources().getDisplayMetrics().density;  

29.         return (int) (dipValue * scale + 0.5f);  

30.     }  

31.   

32.     /** 

33.      * 将px值转换为sp值,保证文字大小不变 

34.      *  

35.      * @param pxValue 

36.      * @param fontScale 

37.      *            (DisplayMetrics类中属性scaledDensity) 

38.      * @return 

39.      */  

40.     public static int px2sp(Context context, float pxValue) {  

41.         final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;  

42.         return (int) (pxValue / fontScale + 0.5f);  

43.     }  

44.   

45.     /** 

46.      * 将sp值转换为px值,保证文字大小不变 

47.      *  

48.      * @param spValue 

49.      * @param fontScale 

50.      *            (DisplayMetrics类中属性scaledDensity) 

51.      * @return 

52.      */  

53.     public static int sp2px(Context context, float spValue) {  

54.         final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;  

55.         return (int) (spValue * fontScale + 0.5f);  

56.     }  

57. }  

 

 显示单位px和dip以及sp的区别

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:
      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  =&gt;
x = 160 / 72 = 2.2222

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

以上供参考,如果 UI 能够以 sp 为单位提供设计是最好的,如果设计中没有
sp
的概念,则开发人员也可以通过适当的换算取近似值。




转载内容:
http://hi.baidu.com/lfcaolibin/blog/item/f3f60d1e438deefee0fe0bae.html
什么是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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值