您的位置:首页 > 移动开发 > Android开发

浅谈android 屏幕适配中 dp和sp的区别

2016-10-04 09:07 309 查看
欢迎转载 转载注明出处

关于dp和sp的具体区别 看网上文章少有深入涉及

介于一次面试被问到:sp和dp的关系是什么?例如一个控件宽度为 15dp 或者 15sp 在大部分情况下是一样的,那什么情况下不同?

找了半天木有这类文章,最后搜集各种资源,在这记录一下;

dp和px的关系:px = dp * (dpi / 160)

Density-independent pixel (dp)独立像素密度。标准是160dip.即1dp对应1个pixel,,屏幕密度越大,1dp对应 的像素点越多。 上面的公式中有个dpi,dpi为DPI是Dots Per Inch(每英寸所打印的点数),也就是当设备的dpi为160的时候1px=1dp;

sp和dp的关系 :

很多文章只是简单的介绍说用于显示文字,但没有深入研究这个单位的区别,

追到Android源码,发现系统内部用applyDimension()将所有单位都转换成px 再处理:

public static float applyDimension(int unit, float value, DisplayMetrics metrics)

{

switch (unit) {

case COMPLEX_UNIT_PX:

return value;

case COMPLEX_UNIT_DIP:

return value * metrics.density;

case COMPLEX_UNIT_SP:

return value * metrics.scaledDensity;

case COMPLEX_UNIT_PT:

return value * metrics.xdpi * (1.0f/72);

case COMPLEX_UNIT_IN:

return value * metrics.xdpi;

case COMPLEX_UNIT_MM:

return value * metrics.xdpi * (1.0f/25.4f);

}

return 0;

}


所以发现dp和sp的区别在于density和scaledDensity两个值上;

–变量density,

float类型,display的logic-density。是一个scaling-factor,用在Density-Independent-Pixel单位,一个dip就是一个像素。

160dpi的screen提供系统display的baseline。

因此,160dpi的screen-density值为1(160/160),120dpi的screen-density值为0.75(120/160)。

screen-1,已知240x320,1.5”x2” ,可以计算出densityDpi等于160。即240/1.5=160,或320/2=160。再通过densityDpi/160计算出density的值1.0。

screen-2,已知320x480,1.5”x2”,可以计算出densityDpi等于240。即320/1.5=240,或480/2=240。再通过densityDpi/160计算出density的值1.5。

–关于scaledDensity

float类型,一个scaling-factor,用于fonts显示,同density相同的值,除非由于基于font-size上的体验需要做微调。

–TyuMainApp.getApp().getResources().getDisplayMetrics()对象中的属性值

总结一下:
dp只跟屏幕的像素密度有关;

sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。

示例图:(测试机器 三星note2)

布局文件:

<Button
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="100dp"
android:id="@+id/button" />
<Button
android:layout_width="100sp"
android:layout_height="wrap_content"
android:text="100sp  "
android:id="@+id/button2" />

当系统字体大小设置为正常时:





当系统字体大小设置为微小时:





正文结束

附加一些android屏幕分辨知识做链接

信息来源:鸿洋大神的博客

Android 屏幕适配方案

提出用百分比和dp换算来解决关于屏幕适配问题的方案,很有思考价值;
Android AutoLayout全新的适配方式 堪称适配终结者

提供了一种根据美工图可以直接写布局,不用考虑px和dp换算的方法,福音啊~~~,稳定和性能还有待测试证明;

关于屏幕分辨率和密度:

密度值表示每英寸有多少个显示点,与分辨率是两个概念。

其屏幕密度标准是:HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120

具体的应用运算关系:假设分辨率是 x*y, 密度为 d, 屏幕实际大小为 a*b那么关系为 x*y = d * a * b (约等于)

不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例density=120时 屏幕实际分辨率为240px*400px (两个点对应一个分辨率)

以及xxxhdpi和4K分辨率

分辨率对应dpi

dpi(dots per inch,每英寸点数)

HVGA : 320x480

WVGA:800x480

FWVGA:854x480

QHD:960x540

720P:1280x720(标清,standard definition,SD)

1080P:1920x1080(高清,high definition,HD)

mdpi对应HVGA(标准)

hdpi对应WVGA、FWVGA、QHD。

xhdpi对应720P。

xxhdpi对应1080P。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android UI适配 手机