您的位置:首页 > 移动开发 > Android开发

Android 单位转换(dp、sp、px)

2016-03-16 16:06 495 查看
Android 系统屏幕密度信息见下表:



独立像素密度 dp

Android 系统使用 mdpi 即密度值为 160 的屏幕作为标准,在这个屏幕上 1px = 1 dp。例如同样是 100dp 的长度,在 mdpi 中为 100px,在 hdpi 中为 150px。各个密度值中的换算公式,在 mdpi 中 1 dp = 1 px,在 hpdi 中 1dp = 1.5 px,在 xhpi 中 1 dp = 2px,在 xxhdpi 中 1 dp = 3 px。所以各个分辨率直接换算比例:

ldpi: mdpi: hdpi: xhdpi: xxhdpi = 3: 4: 6: 8: 12。

下面是单位转换(可以作为工具类):

DisplayUtil.java :

package com.imooc.anim;

import android.content.Context;

/**
*  dp、sp 转换为 px 的工具类
*/
public class DisplayUtil {

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

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

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

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

}


其中 density 就是前面所说的换算比例,这里使用的是公式换算方法进行转换。同时,系统也提供了 TypedValue 类帮助我们转换,代码如下:

/**
*  dp2px 系统提供的 TypedValue 类帮我们转换
* @param context
* @param dp
* @return
*/
protected int dp2px(Context context,int dp) {
return (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dp,
context.getResources().getDisplayMetrics());
}

/**
* sp2px 系统提供的 TypedValue 类帮我们转换
* @param context
* @param sp
* @return
*/
protected int sp2px(Context context, int sp) {
return (int)TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
sp,
context.getResources().getDisplayMetrics());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: