package com.marshalchen.common.uimodule.smoothswitch; import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Rect; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; public class ViewUtils { private static int width; private static int height; public static void init(Context context) { Resources res = context.getResources(); DisplayMetrics metrics = res.getDisplayMetrics(); width = metrics.widthPixels; height = metrics.heightPixels; } public static int getScreenWidth() { return width; }; public static int getScreenHeight() { return height; }; /** * change dip value to pixel value for certain screen size * * @param dipValue * @param context * @return */ public static int getPixels(int dipValue, Context context) { int result = 0; Resources res = context.getResources(); result = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, res.getDisplayMetrics()); return result; } /** * change View to Bitmap Object * * @param v * @return */ public static Bitmap loadBitmapFromView(View v) { if (v == null) { return null; } Bitmap screenshot; screenshot = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Config.ARGB_8888); Canvas c = new Canvas(screenshot); c.translate(-v.getScrollX(), -v.getScrollY()); v.draw(c); return screenshot; } /** * compute sample size you want * * @param options * @param minSideLength * @param maxNumOfPixels * @return */ public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } /** * compute bitmap initial sample size * * @param options * @param minSideLength * @param maxNumOfPixels * @return */ private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the larger one when there is no overlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } } public static int getStatusBarHeight(Activity context) { Rect rect = new Rect(); context.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); return rect.top; } }