细谈android中的px、sp、dip、dp的区别与联系,以及转化规则
先上一张自己制作的表格,其中转化的时候,分别以60dp和60px为例转化。
文章图片
图-1
文章图片
图-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。
dp与px换算公式:
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多分辨率适配
推荐阅读
- 热闹中的孤独
- android第三方框架(五)ButterKnife
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 放下心中的偶像包袱吧
- 带有Hilt的Android上的依赖注入
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解