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

先上一张自己制作的表格,其中转化的时候,分别以60dp和60px为例转化。

细谈android中的px、sp、dip、dp的区别与联系,以及转化规则_第1张图片
图-1
细谈android中的px、sp、dip、dp的区别与联系,以及转化规则_第2张图片
图-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多分辨率适配

你可能感兴趣的:(细谈android中的px、sp、dip、dp的区别与联系,以及转化规则)