Android系统中,默认的单位是像素(px)。就是说,在没有明确说明的情况下,所有的大小设置都是以像素为单位。
如果以像素设置大小,会导致不同分辨率下出现不同的效果(因为屏幕分辨率与屏幕的大小没有关联)。那么,如何将应用中所有大小的单位都设置为’dp’呢?
大家还在为 android px 和 dip,dp; px 和 sp 的相互转化而烦恼吗? 今天我就来解决大家这个烦恼,一个简单的转化工具类,从此再也不要烦恼了。
import android.content.Context;
public class DisplayUtil {
/**
* 将px转为dip或dp
* @param context
* @param pxValue
* @return
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return getDivRound(pxValue, scale);
// return (int)(pxValue / scale + 0.5f);
}
/**
* 将dip或dp转为px
* @param context
* @param dipValue
* @return
*/
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return getMultRound(dipValue, scale);
// return (int)(dipValue * scale + 0.5f);
}
/**
* 将px转为sp
* @param context
* @param pxValue
* @return
*/
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return getDivRound(pxValue, fontScale);
// return (int)(pxValue / fontScale + 0.5f);
}
/**
* 将sp转为px
* @param context
* @param spValue
* @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return getMultRound(spValue, fontScale);
// return (int)(spValue * fontScale + 0.5f);
}
/**
* 乘法运行并四舍五入
* @param x
* @param y
* @return
*/
public static int getMultRound(float x, float y){
return Math.round(x*y);
}
/**
* 除法运行并四舍五入
* @param dividend 被除数
* @param divisor 除数
* @return
*/
public static int getDivRound(float dividend, float divisor){
return Math.round(dividend/divisor);
}
}