在java代码中进行px与dip(dp)、px与sp单位值的转换

    其实都是以前保存的代码,最近发现自己的资料库很混乱,索性都整理成博客,方便以后自己要用的时候快速找到。

DisplayUtil.java

/**
 * 单位转换工具
 * 
 * @author carrey
 * 
 */
public class DisplayUtil {
	/**
	 * 将px值转换为dip或dp值,保证尺寸大小不变
	 * 
	 * @param pxValue
	 * @param scale
	 *            (DisplayMetrics类中属性density)
	 * @return
	 */
	public static int px2dip(float pxValue, float scale) {
		return (int) (pxValue / scale + 0.5f);
	}

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

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

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

DisplayParams.java

/**
 * 屏幕参数工具
 * 
 * @author carrey
 * 
 */
public class DisplayParams {
	/** 屏幕宽度——px */
	public int screenWidth;
	/** 屏幕高度——px */
	public int screenHeight;
	/** 屏幕密度——dpi */
	public int densityDpi;
	/** 缩放系数——densityDpi/160 */
	public float scale;
	/** 文字缩放系数 */
	public float fontScale;
	/** 屏幕朝向 */
	public int screenOrientation;
	/** 表示屏幕朝向垂直 */
	public final static int SCREEN_ORIENTATION_VERTICAL = 1;
	/** 表示屏幕朝向水平 */
	public final static int SCREEN_ORIENTATION_HORIZONTAL = 2;

	private static DisplayParams singleInstance;

	/**
	 * 私有构造方法
	 * 
	 * @param context
	 */
	private DisplayParams(Context context) {
		DisplayMetrics dm = context.getResources().getDisplayMetrics();
		screenWidth = dm.widthPixels;
		screenHeight = dm.heightPixels;
		densityDpi = dm.densityDpi;
		scale = dm.density;
		fontScale = dm.scaledDensity;
		screenOrientation = screenHeight > screenWidth ? SCREEN_ORIENTATION_VERTICAL
				: SCREEN_ORIENTATION_HORIZONTAL;
	}

	/**
	 * 获取实例
	 * 
	 * @param context
	 * @return
	 */
	public static DisplayParams getInstance(Context context) {
		if (singleInstance == null) {
			singleInstance = new DisplayParams(context);
		}
		return singleInstance;
	}

	/**
	 * 获取新的实例
	 * 
	 * @param context
	 * @return
	 */
	public static DisplayParams getNewInstance(Context context) {
		if (singleInstance != null) {
			singleInstance = null;
		}
		return getInstance(context);
	}
}


使用示例:

	/**
	 * 设置文本大小
	 * @param textSizeSp 文本大小,单位是sp
	 */
	public void setTextSize(int textSizeSp) {
		DisplayParams displayParams = DisplayParams.getInstance(context);
		this.textSize = DisplayUtil.sp2px(textSize, displayParams.fontScale);
		invalidate();
	}
原文地址:https://www.cnblogs.com/riskyer/p/3283254.html