Android dp,px,sp之间的转换

Android 对于这个来说,是个小知识点,但对于有些情况还是很有必要的,毕竟这样也可以适配很多手机,虽然,后续随着AS的升级,百分比布局的出现,用到此功能的也许是在少数。先我们来看看它们之间的转换:

dp是虚拟像素,在不同的像素密度的设备上会自动适配,当然sp也一样。可想而知,px可不能适配。

下面看看dp,ps跟px的转换:

在320x480分辨率,1dp=1px
在480x800分辨率,1dp=1.5px

像素密度(PPI)怎么计算呢?看下面的这个公试:

PPI= (Math.sqrt(Math.pow(宽度像素数,2)+Math.pow(长度像素数, 2))/屏幕对角线英寸数

所以物理尺寸(屏幕对角线英寸数)的获取公式:

(Math.sqrt(Math.pow(宽度像素数,2)+Math.pow(长度像素数, 2))/PPI = 屏幕物理尺寸(屏幕对角线英寸数)

那么dp与px怎么转换呢?

dp*ppi/160 = px

所以:
HVGA屏320*480,一般是3.5寸,计算点密度为√ (320^2 + 480^2) / 3.5 = 164,约等于160,1pd * (164/160)=1px

WVGA屏480*800,按3.8寸屏算,点密度 √ (480^2 + 800^2) / 3.8 = 245,约等于240,1dp * (240/160)=1.5px。

下面就来看看Android 的代码怎么实现:

public class DisplayUtil {
/**
 * 将px值转换为dip或dp值,保证尺寸大小不变
 *
 * @param pxValue
 *            (DisplayMetrics类中属性density)
 * @return
 */
public static int px2dip(Context context, float pxValue) {

    //这里的scale即为PPI(像素密度)
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (pxValue / scale + 0.5f);
}

/**
 * 将dip或dp值转换为px值,保证尺寸大小不变
 *
 * @param dipValue
 *            (DisplayMetrics类中属性density)
 * @return
 */
public static int dip2px(Context context, float dipValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dipValue * scale + 0.5f);
}

/**
 * 将px值转换为sp值,保证文字大小不变
 *
 * @param pxValue
 *            (DisplayMetrics类中属性scaledDensity)
 * @return
 */
public static int px2sp(Context context, float pxValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (pxValue / fontScale + 0.5f);
}

/**
 * 将sp值转换为px值,保证文字大小不变
 *
 * @param spValue
 *            (DisplayMetrics类中属性scaledDensity)
 * @return
 */
public static int sp2px(Context context, float spValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (spValue * fontScale + 0.5f);
}

}

你可能感兴趣的:(Android)