Android度量单位说明(DIP,DP,PX,SP)
(⼀)概念
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 等类的源码
ca COMPLEX_UNIT_PX:
return value;
ca COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
ca 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 / 7
2 = 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(磅):是⼀个标准的长度单位,1pt=1/72英⼨,⽤于印刷业,⾮常简单易⽤。
sp(与刻度⽆关的像素):scaled pixels(放⼤像素). 主要⽤于字体显⽰best for textsize,TextView 的字号可使⽤ 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 = (SystemService(Context.WINDOW_SERVICE);
//屏幕的分辨率
int width = dm.widthPixels() ;
int height = dm.heightPixels();
注:构造函数DisplayMetrics 不需要传递任何参数;获得WindowManager 之后, getDefaultDisplay() ⽅法将取得的默认的显⽰信息,返回的是⼀个Display 对象,此对象的getMetrics(Metrics metrics)⽅法把分辨率信息传到 DisplayMetrics 对象中。
通过 String()⽅法可以获取到 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为显⽰的逻辑分辨率;width及height就为屏幕分辨率(为绝对宽度与⾼度),与fields中的widthPixels及 heightPixels⼀致;scaleDensity与density⼀致;xdpi及ydpi为x⽅向与y⽅向的像素密度。
劳动合同解除证明>黄色的英语怎么写
如何计算密度(dpi)
1.标准是240*320画在1.5*2平⽅inch上。那么像每平⽅英⼨有240*320/(1.5*2)=25600点,也就是⼀平⽅英⼨的像素点为25600,所以dpi取为它的平⽅根160;如果你的dpi是120,那么它的密度就是0.75.
2.密度不只是与width有关,还与height有关,所以不管width是1.8还是1.3,它的密度都有可能是1;⽐如width是1.8,只要它的height是3/1.8的话,如果pixel为240*320的话,它的密度仍旧是1;同样如果width为1.3,只要它的 height为3/1.3的话,像素点为240*320,则密度也是1.
3.320*480/(1.5*2)得到单位平⽅英⼨的点为51200,所以单位平⽅英⼨是240*320画在1.5*2屏幕的2倍。但是这是平⽅英⼨啊,算密度的时候要开平⽅的啊,所以应该是2开平⽅,是1.414吧,⼤致密度为1.5。
px与dip的关系:
Android中,在160dpi (mdpi)中, 1 dip= 1 px;
以此类推,在120dpi(ldpi)中, 1 dip = 0.75px;
在240dpi (hdpi)中, 1 dip = 1.5px;
莫干山庄在320dpi(xhdpi)中, 1dip = 2px;
如何做到与密度⽆关:
梦见发洪水
如果屏幕密度为160,这时dp和sp和px是⼀样的。1dp=1sp=1px,但如果使⽤px作单位,如果屏幕⼤⼩不变(假设还是3.2⼨),⽽屏幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的3.2 ⼨屏幕⾥看要⽐在密度为160的3.2⼨屏幕上看短了⼀半。但如果设置成160dp或160sp的话。系统会⾃动将width属性值设置成320px的。也就是160 * 320 / 160。其中320 / 160可称为密度⽐例因⼦。也就是说,如果使⽤dp和sp,系统会根据屏幕密度的变化⾃动进⾏转换。官⽅⽂档总结的计算公式为: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.tWidth() 和 tHeight()来设置View宽度和⾼度,但是这两个⽅法接收的是以像素单位的值,也就说,如果要⽤代码的形式来以dip 为单位设置View⼤⼩,则需要先将dip转换为px。
这⾥可以使⽤如下⽅法,如下:
public static int px2dip(Context context, float pxValue) {
final float scale = Resources().getDisplayMetrics().density ;
return (int) (pxValue / scale + 0.5f) ;
}
public static int dip2px(Context context, float dpValue) {
final float scale = Resources().getDisplayMetrics().density ;
return (int) (dpValue * scale + 0.5f) ;
}
将dip数值转换为px后,在调⽤tWidth() 和tHeight()来设置View宽度和⾼度。默认的控件⼤⼩:
当在屏幕为160dpi,也就是density为1的情况下,所得到的控件的宽度和⾼度为android控件的默认的dip⼤⼩。
⽐如:Button 的默认⾼度为 48dip。
状态栏的默认⾼度为25dip。
总结:对于UI布局,要使⽤dip或者dp作为单位,对应字体要是有sp作为单位,要尽量少使⽤px作为单位。