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的最大高度和宽度或者行数等限制,避免布局因用户字体放大导致整体布局严重变形