Android开发中的dp、px、dpi、sp区别和联系

px   :像素,代表屏幕上的像素点。

dp   :一个基于屏幕密度的抽象单位,如果一个160dpi的屏幕即标准屏幕,那么1dp=1px。长度宽度的数值要使用dp作为单位放入dimens.xml文件中,当dp不能作为适配单位时,就需要使用px。

dip :等同于dp。

dpi :一英寸长的直线上的像素点的数量来评价屏幕的显示效果,即像素密度。不同的设备,dpi值不同,显示效果不同,dpi的值跟设备硬件有关。标准值是160dp。等于px/inch

sp   :同dp相似,但还会根据用户的字体大小偏好来缩放(建议使用sp作为文本的单位,其它用dip。字体大小的数值要使用sp作为单位,也放入dimens.xml文件中

理解dp:

    其实dp就是为了使得开发者设置的长度能够根据不同屏幕(分辨率/尺寸也就是dpi)获得不同的像素(px)数量。比如:我将一个控件设置长度为1dp,那么在160dpi上该控件长度为1px,在240dpi的屏幕上该控件的长度为1*240/160=1.5个像素点。也就是说dp会随着不同屏幕而改变控件长度的像素数量。关于dp的官方叙述为当屏幕每英寸有160个像素时(也就是160dpi),dp与px等价的。那如果每英寸240个像素呢?就等于1*240/160=1.5px,即1dp与1.5px等价了。dp最终都要化为像素数量来衡量大小的,因为只有像素数量最直观。dp转px只与屏幕的dpi有关,dp值×(dpi/160dpi)=px当前的像素数目。而假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度。

获取手机的设备的配置信息

      DisplayMetrics d = getResources().getDisplayMetrics();//可以获得scaledDensity,densityDpi,heightPixels,widthPixels等信息。
        Configuration configuration = getResources().getConfiguration();//获取设备的配置信息
        configuration.screenHeightDp  //当前屏幕可用空间的高度,单位是dp
        configuration.screenWidthDp   //当前屏幕可用空间的宽度,单位是dp
        int densityDpi = configuration.densityDpi;//当前设备的dpi信息

项目下文件mdpi、hdpi、xdpi、xxdpi、xxxdpi

名称 像素密度范围 图标尺寸 dp与px转化比例
mdpi 120dpi~160dpi 48x48px 1
hdpi 160dpi~240dpi 72x72px 1.5
xhdpi 240dpi~320dpi 96x96px 2
xxhdpi 320dpi~480dpi 144x144px 3
xxxhdpi 480dpi~640dpi 192x192px 4

    为什么用dp做文字单位不如sp好,在Google 文档中对sp 是这样描述的:

    这与dp单位相似,但也会根据用户的字体大小偏好进行缩放。 建议您在指定字体大小时使用本单位,以便针对屏幕密度和用户偏好进行调整。

    建议:如果textview的大小有严格的比例或者高度限制,我们需要给出textview的最大高度和宽度或者行数等限制,避免布局因用户字体放大导致整体布局严重变形

 

 

猜你喜欢

转载自blog.csdn.net/ZytheMoon/article/details/88980319
今日推荐