根据公式dp = px / 设备密度
public class DisplayUtil {
/**
* 将 dp 或 dip 值转换为 px 值,保证尺寸大小不变
*
* @param dip
* @param ctx
* @return
*/
public static int dip2px(float dip, Context ctx) {
final float density = ctx.getResources().getDisplayMetrics().density;
int px = (int) (dip * density + 0.5f); //四舍五入
return px;
}
/**
* 将 px 值转换为 dp 或 dip 值,保证尺寸大小不变
*
* @param px
* @param ctx
* @return
*/
public static int px2dip(float px, Context ctx) {
final float density = ctx.getResources().getDisplayMetrics().density;
int dp = (int) (px / density + 0.5f);
return dp;
}
/**
* 将 px 值转换为 sp 值,保证文字大小不变
*
* @param px
* @param ctx
* @return
*/
public static int px2sp(float px, Context ctx) {
final float fontScale = ctx.getResources().getDisplayMetrics().scaledDensity;
int sp = (int) (px / fontScale + 0.5f);
return sp;
}
/**
* 将 sp 值转换为 px 值,保证文字大小不变
*
* @param sp
* @param ctx
* @return
*/
public static int sp2px(float sp, Context ctx) {
final float fontScale = ctx.getResources().getDisplayMetrics().scaledDensity;
int px = (int) (sp * fontScale + 0.5f);
return px;
}
}
使用 Android 系统中 TypedValue.applyDimension() 转换
- 把 Android 系统中非标准度量尺寸转换成标准度量尺寸。
- 非标准度量尺寸:dp, in, mm, pt, sp。
- 标准度量尺寸:px(Android 系统内部使用的单位)
- 代码示例,可配置非标准度量参数。
// dp->px:
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, context.getResources().getDisplayMetrics());
//sp->px:
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, context.getResources().getDisplayMetrics());
//in->px:
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 20, context.getResources().getDisplayMetrics());