细谈android中的px、sp、dip、dp的区别与联系,以及转化规则

先上一张自己制作的表格,其中转化的时候,分别以60dp和60px为例转化。
细谈android中的px、sp、dip、dp的区别与联系,以及转化规则
文章图片
图-1 细谈android中的px、sp、dip、dp的区别与联系,以及转化规则
文章图片
图-2 在项目的资源文件夹下,一般我们都会以mdpi

(屏幕密度160ppi)为基准,1dp = 1px,其余的按照比例计算即可。像素密度,单位:ppi。公式:px = dp * (dpi /160)
当屏幕density=120ppi时,使用ldpi标签的资源
当屏幕density=160ppi时,使用mdpi标签的资源此处为基准,1dp = 1px
当屏幕density=240ppi时,使用hdpi标签的资源
当屏幕density=320ppi时,使用xhdpi标签的资源
当屏幕density=480ppi时,使用xxhdpi标签的资源
当屏幕density=640ppi时,使用xxxhdpi标签的资源android4.3新增,为4K而准备
不加任何标签的资源是各种分辨率情况下共用的,所以布局时尽量使用单位dip,少使用px。
dppx换算公式:
pixs =dips *
(densityDpi/160).
dips=(pixs*160)/densityDpi
但是我们在代码里面进行转化的时候还需要有一个偏移值:0.5f
附上dp与px转化代码:
private static final float scale = mContext.getResources().getDisplayMetrics().density;
private static final float scaledDensity = mContext.mContext.getResources().getDisplayMetrics().scaledDensity;
/**
* dp转成px
* @param dipValue
* @return
*/
public static int dip2px(float dipValue) {
return (int) (dipValue * scale +0.5f);
}
/**
* px转成dp
* @param pxValue
* @return
*/
public static int px2dip(float pxValue) {
return (int) (pxValue / scale +0.5f);
}
/**
* sp转成px
* @param spValue
* @param type
* @return
*/
public static float sp2px(float spValue, int type) {
switch (type) {
case CHINESE:
return spValue * scaledDensity;
case NUMBER_OR_CHARACTER:
return spValue * scaledDensity *10.0f / 18.0f;
default:
return spValue * scaledDensity;
}
}
最后的最后,想放上一个关于多分辨率适配的解决方案的博客地址。是鸿洋大神写的。
【细谈android中的px、sp、dip、dp的区别与联系,以及转化规则】android多分辨率适配

    推荐阅读