package com.linkdialy.mobile.kuyicloud.utils; import android.content.Context; import android.view.View; import android.view.ViewTreeObserver; public class SizeUtils { /** * The absolute height of the display in pixels * * @param context Context * @return px(int) */ public static int getScreenHeight(Context context) { return context.getResources().getDisplayMetrics().heightPixels; } /** * The absolute width of the display in pixels * * @param context Context * @return px(int) */ public static int getScreenWidth(Context context) { return context.getResources().getDisplayMetrics().widthPixels; } /** * Size tool to convert dp to px * * @param context Context * @param dpValue dp unit * @return The converted size in pixel */ public static int convertDp2Px(Context context, int dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * Size tool to convert px to dp * * @param context Context * @param pxValue px unit * @return The converted size in pixel */ public static int convertPx2Dp(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * Size tool to convert px to dp * * @param context Context * @param spValue px unit * @return The converted size in pixel */ public static int convertSp2Px(Context context, float spValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } /** * Size tool to convert px to dp * * @param context Context * @param pxValue px unit * @return The converted size in pixel */ public static int convertPx2Sp(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / scale + 0.5f); } /** * Gain the width of the widget * * @param view The view to be measured * @return Get the width of the widget */ public static int getWidgetWidth(View view) { int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); view.measure(w, h); return view.getMeasuredWidth(); } /** * Gain the height of the widget * * @param view The view to be measured * @return Get the Height of the widget */ public static int getWidgetHeight(View view) { int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); view.measure(w, h); return view.getMeasuredHeight(); } public static int getWidgetHeightWithObv(final View view) { int height = 0; final ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { viewTreeObserver.removeOnPreDrawListener(this); // h = view.getMeasuredHeight(); return true; } }); return height; } // // No2: // // ViewTreeObserver vto = imageView.getViewTreeObserver(); // vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { // public boolean onPreDraw() { // vto.removeOnPreDrawListener(this); // int height = imageView.getMeasuredHeight(); // int width = imageView.getMeasuredWidth(); // return true; // } // }); // // 这个方法,我们需要注册一个ViewTreeObserver的监听回调,这个监听回调,就是专门监听绘图的,既然是监听绘图,那么我们自然可以获取测量值了,同时,我们在每次监听前remove前一次的监听,避免重复监听。 // // // // No3: // // ViewTreeObserver vto = imageView.getViewTreeObserver(); // vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { // @Override // public void onGlobalLayout() { // imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this); // imageView.getHeight(); // imageView.getWidth(); // } // }); // // 这个方法于第2个方法基本相同,但他是全局的布局改变监听器,所以是最推荐使用的。 }