根據公式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());