package lzf.video.edit.utils; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; /** * <pre> * author: Blankj * blog : http://blankj.com * time : 2016/8/2 * desc : 尺寸相关工具类 * </pre> */ public class SizeUtils { private SizeUtils() { throw new UnsupportedOperationException("u can't instantiate me..."); } /** * dp转px * * @param dpValue dp值 * @return px值 */ public static int dp2px(float dpValue) { final float scale = Utils.getContext().getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * px转dp * * @param pxValue px值 * @return dp值 */ public static int px2dp( float pxValue) { final float scale = Utils.getContext().getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * sp转px * * @param spValue sp值 * @return px值 */ public static int sp2px(float spValue) { final float fontScale = Utils.getContext().getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } /** * px转sp * * @param pxValue px值 * @return sp值 */ public static int px2sp( float pxValue) { final float fontScale = Utils.getContext().getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } /** * 各种单位转换 * <p>该方法存在于TypedValue</p> * * @param unit 单位 * @param value 值 * @param metrics DisplayMetrics * @return 转换结果 */ public static float applyDimension(int unit, float value, DisplayMetrics metrics) { switch (unit) { case TypedValue.COMPLEX_UNIT_PX: return value; case TypedValue.COMPLEX_UNIT_DIP: return value * metrics.density; case TypedValue.COMPLEX_UNIT_SP: return value * metrics.scaledDensity; case TypedValue.COMPLEX_UNIT_PT: return value * metrics.xdpi * (1.0f / 72); case TypedValue.COMPLEX_UNIT_IN: return value * metrics.xdpi; case TypedValue.COMPLEX_UNIT_MM: return value * metrics.xdpi * (1.0f / 25.4f); } return 0; } /** * 在onCreate中获取视图的尺寸 * <p>需回调onGetSizeListener接口,在onGetSize中获取view宽高</p> * <p>用法示例如下所示</p> * <pre> * SizeUtils.forceGetViewSize(view, new SizeUtils.onGetSizeListener() { * Override * public void onGetSize(View view) { * view.getWidth(); * } * }); * </pre> * * @param view 视图 * @param listener 监听器 */ public static void forceGetViewSize(final View view, final onGetSizeListener listener) { view.post(new Runnable() { @Override public void run() { if (listener != null) { listener.onGetSize(view); } } }); } /** * 获取到View尺寸的监听 */ public interface onGetSizeListener { void onGetSize(View view); } public static void setListener(onGetSizeListener listener) { mListener = listener; } private static onGetSizeListener mListener; /** * 测量视图尺寸 * * @param view 视图 * @return arr[0]: 视图宽度, arr[1]: 视图高度 */ public static int[] measureView(View view) { ViewGroup.LayoutParams lp = view.getLayoutParams(); if (lp == null) { lp = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT ); } int widthSpec = ViewGroup.getChildMeasureSpec(0, 0, lp.width); int lpHeight = lp.height; int heightSpec; if (lpHeight > 0) { heightSpec = View.MeasureSpec.makeMeasureSpec(lpHeight, View.MeasureSpec.EXACTLY); } else { heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); } view.measure(widthSpec, heightSpec); return new int[]{view.getMeasuredWidth(), view.getMeasuredHeight()}; } /** * 获取测量视图宽度 * * @param view 视图 * @return 视图宽度 */ public static int getMeasuredWidth(View view) { return measureView(view)[0]; } /** * 获取测量视图高度 * * @param view 视图 * @return 视图高度 */ public static int getMeasuredHeight(View view) { return measureView(view)[1]; } }