1.计算屏幕密度
public static int px2dip(Context context,float pxValue){
final float scale=context.getResources().getDisplayMetrics().density;
return (int)(pxValue/scale+0.5f);
}
public static int dip2px(Context context,float dipValue){
final float scale=context.getResources().getDisplayMetrics().density;
return (int)(dipValue*scale+0.5f);
}
public static int px2sp(Context context,float pxValue){
final float fontScale=context.getResources().getDisplayMetrics().scaledDensity;
return (int)(pxValue/fontScale+0.5f);
}
public static int sp2px(Context context,float spValue){
final float fontScale=context.getResources().getDisplayMetrics().scaledDensity;
return (int)(spValue*fontScale+0.5f);
}
2.TypedValue
public static int dp2px(Context context,int dp){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,context.getResources().getDisplayMetrics());
}
public static int px2dp(Context context,int sp){
return (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,sp,context.getResources().getDisplayMetrics());
}
其实 TypedValue.applyDimension也是用1的方式实现的:
/**
* Converts an unpacked complex data value holding a dimension to its final floating
* point value. The two parameters unit and value
* are as in {@link #TYPE_DIMENSION}.
*
* @param unit The unit to convert from.
* @param value The value to apply the unit to.
* @param metrics Current display metrics to use in the conversion --
* supplies display density and scaling information.
*
* @return The complex floating point value multiplied by the appropriate
* metrics depending on its unit.
*/
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}