package com.mcxiaoke.next.utils;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Point;
import android.os.Build;
import android.os.Build.VERSION_CODES;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Display;
import android.view.View;
import java.lang.reflect.Method;
/**
* User: mcxiaoke
* Date: 14-3-26
* Time: 16:08
*/
public class ViewUtils {
// temp variable
private static TypedValue mTmpValue = new TypedValue();
// This intro hides the system bars.
@TargetApi(VERSION_CODES.KITKAT)
public static void hideSystemUI(Activity activity) {
// Set the IMMERSIVE flag.
// Set the content to appear under the system bars so that the content
// doesn't resize when the system bars hideSelf and show.
View decorView = activity.getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hideSelf nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hideSelf status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE
);
}
// This intro shows the system bars. It does this by removing all the flags
// except for the ones that make the content appear under the system bars.
@TargetApi(VERSION_CODES.KITKAT)
public static void showSystemUI(Activity activity) {
View decorView = activity.getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
);
}
/**
* 23 * Returns true if view's layout direction is right-to-left.
* 24 *
* 25 * @param view the View whose layout is being considered
* 26
*/
public static boolean isLayoutRtl(View view) {
if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
return view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
} else {
// All layouts are LTR before JB MR1.
return false;
}
}
public static Point getScreenRawSize(Display display) {
if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
Point outPoint = new Point();
DisplayMetrics metrics = new DisplayMetrics();
display.getRealMetrics(metrics);
outPoint.x = metrics.widthPixels;
outPoint.y = metrics.heightPixels;
return outPoint;
} else {
Point outPoint = new Point();
Method mGetRawH;
try {
mGetRawH = Display.class.getMethod("getRawHeight");
Method mGetRawW = Display.class.getMethod("getRawWidth");
outPoint.x = (Integer) mGetRawW.invoke(display);
outPoint.y = (Integer) mGetRawH.invoke(display);
return outPoint;
} catch (Throwable e) {
return new Point(0, 0);
}
}
}
public static int getActionBarHeightInDp(Context context) {
int actionBarHeight = 0;
TypedValue tv = new TypedValue();
final DisplayMetrics dm = context.getResources().getDisplayMetrics();
if (Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB) {
if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv,
true))
actionBarHeight = (int) TypedValue.complexToFloat(tv.data);
} else {
tv.data = 48;
actionBarHeight = (int) TypedValue.complexToFloat(tv.data);
}
return actionBarHeight;
}
public static int getActionBarHeight(Context context) {
int actionBarHeight = 0;
TypedValue tv = new TypedValue();
final DisplayMetrics dm = context.getResources().getDisplayMetrics();
if (Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB) {
if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv,
true))
actionBarHeight = TypedValue.complexToDimensionPixelSize(
tv.data, dm);
} else {
tv.data = 48;
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,
dm);
}
return actionBarHeight;
}
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
public static int getSystemBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("system_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
public static int getStatusBarHeightInDp(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResourceValue(context, resourceId);
}
return result;
}
public static int getSystemBarHeightInDp(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("system_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResourceValue(context, resourceId);
}
return result;
}
/**
* 获取资源中的数值,没有经过转换,比如dp,sp等
*/
public static int getResourceValue(Context context, int resId) {
TypedValue value = mTmpValue;
context.getResources().getValue(resId, value, true);
return (int) TypedValue.complexToFloat(value.data);
}
public static int dpToPx(Context context, int dp) {
return (int) ((dp * context.getResources().getDisplayMetrics().density) + 0.5);
}
public static int pxToDp(Context context, int px) {
return (int) ((px / context.getResources().getDisplayMetrics().density) + 0.5);
}
public static int pxToDp(float px) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
float dp = px / (metrics.densityDpi / 160f);
return Math.round(dp);
}
public static int dpToPx(float dp) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
float px = dp * (metrics.densityDpi / 160f);
return Math.round(px);
}
@SuppressWarnings({"unchecked", "UnusedDeclaration"})
public static <T extends View> T findById(View view, int id) {
return (T) view.findViewById(id);
}
@SuppressWarnings({"unchecked", "UnusedDeclaration"})
public static <T extends View> T findById(Activity activity, int id) {
return (T) activity.findViewById(id);
}
}