在开发中,经常会需要会各种栏的设置。比如,获取状态栏高度,对状态栏进行隐藏等,为此,对于这些操作整理了下
目录
public static int getStatusBarHeight() {
Resources resources = Utils.getApp().getResources();
int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
return resources.getDimensionPixelSize(resourceId);
}
public static void setStatusBarVisibility(@NonNull final Activity activity,final boolean isVisible) {
setStatusBarVisibility(activity.getWindow(), isVisible);
}
public static void setStatusBarVisibility(@NonNull final Window window, final boolean isVisible) {
if (isVisible) {
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}
public static void setStatusBarLightMode(@NonNull final Activity activity,final boolean isLightMode) {
setStatusBarLightMode(activity.getWindow(), isLightMode);
}
public static void setStatusBarLightMode(@NonNull final Window window,final boolean isLightMode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
View decorView = window.getDecorView();
if (decorView != null) {
int vis = decorView.getSystemUiVisibility();
if (isLightMode) {
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
} else {
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
decorView.setSystemUiVisibility(vis);
}
}
}
//getStatusBarHeight()方法见文章开头
private static final int TAG_OFFSET = -123;
public static void addMarginTopEqualStatusBarHeight(@NonNull View view) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
Object haveSetOffset = view.getTag(TAG_OFFSET);
if (haveSetOffset != null && (Boolean) haveSetOffset) return;
MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams();
layoutParams.setMargins(layoutParams.leftMargin,
layoutParams.topMargin + getStatusBarHeight(),
layoutParams.rightMargin,
layoutParams.bottomMargin);
view.setTag(TAG_OFFSET, true);
}
//getStatusBarHeight()方法见文章开头
private static final int TAG_OFFSET = -123;
public static void subtractMarginTopEqualStatusBarHeight(@NonNull View view) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
Object haveSetOffset = view.getTag(TAG_OFFSET);
if (haveSetOffset == null || !(Boolean) haveSetOffset) return;
MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams();
layoutParams.setMargins(layoutParams.leftMargin,
layoutParams.topMargin - getStatusBarHeight(),
layoutParams.rightMargin,
layoutParams.bottomMargin);
view.setTag(TAG_OFFSET, false);
}
private static final int DEFAULT_ALPHA = 112;
public static void setStatusBarColor(@NonNull final Activity activity, @ColorInt final int color) {
setStatusBarColor(activity, color, DEFAULT_ALPHA, false);
}
public static void setStatusBarColor(@NonNull final Activity activity, @ColorInt final int color,@IntRange(from = 0, to = 255) final int alpha) {
setStatusBarColor(activity, color, alpha, false);
}
public static void setStatusBarColor(@NonNull final Activity activity,@ColorInt final int color,@IntRange(from = 0, to = 255) final int alpha,final boolean isDecor) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
hideAlphaView(activity);
transparentStatusBar(activity);
addStatusBarColor(activity, color, alpha, isDecor);
}
private static final String TAG_COLOR = "TAG_COLOR";
private static void hideColorView(final Activity activity) {
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
View fakeStatusBarView = decorView.findViewWithTag(TAG_COLOR);
if (fakeStatusBarView == null) return;
fakeStatusBarView.setVisibility(View.GONE);
}
private static void transparentStatusBar(final Activity activity) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
Window window = activity.getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
int option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
window.getDecorView().setSystemUiVisibility(option);
window.setStatusBarColor(Color.TRANSPARENT);
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
private static void addStatusBarColor(final Activity activity,
final int color,final int alpha,boolean isDecor) {
ViewGroup parent = isDecor ?
(ViewGroup) activity.getWindow().getDecorView() :
(ViewGroup) activity.findViewById(android.R.id.content);
View fakeStatusBarView = parent.findViewWithTag(TAG_COLOR);
if (fakeStatusBarView != null) {
if (fakeStatusBarView.getVisibility() == View.GONE) {
fakeStatusBarView.setVisibility(View.VISIBLE);
}
fakeStatusBarView.setBackgroundColor(getStatusBarColor(color, alpha));
} else {
parent.addView(createColorStatusBarView(parent.getContext(), color, alpha));
}
}
private static int getStatusBarColor(final int color, final int alpha) {
if (alpha == 0) return color;
float a = 1 - alpha / 255f;
int red = (color >> 16) & 0xff;
int green = (color >> 8) & 0xff;
int blue = color & 0xff;
red = (int) (red * a + 0.5);
green = (int) (green * a + 0.5);
blue = (int) (blue * a + 0.5);
return Color.argb(255, red, green, blue);
}
private static View createColorStatusBarView(final Context context,
final int color,final int alpha) {
View statusBarView = new View(context);
statusBarView.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight()));
statusBarView.setBackgroundColor(getStatusBarColor(color, alpha));
statusBarView.setTag(TAG_COLOR);
return statusBarView;
}
public static int getActionBarHeight() {
TypedValue tv = new TypedValue();
if (Utils.getApp().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
return TypedValue.complexToDimensionPixelSize(
tv.data, Utils.getApp().getResources().getDisplayMetrics()
);
}
return 0;
}
//
@RequiresPermission(EXPAND_STATUS_BAR)
public static void setNotificationBarVisibility(final boolean isVisible) {
String methodName;
if (isVisible) {
methodName = (Build.VERSION.SDK_INT <= 16) ? "expand" : "expandNotificationsPanel";
} else {
methodName = (Build.VERSION.SDK_INT <= 16) ? "collapse" : "collapsePanels";
}
invokePanels(methodName);
}
private static void invokePanels(final String methodName) {
try {
@SuppressLint("WrongConstant")
Object service = Utils.getApp().getSystemService("statusbar");
@SuppressLint("PrivateApi")
Class> statusBarManager = Class.forName("android.app.StatusBarManager");
Method expand = statusBarManager.getMethod(methodName);
expand.invoke(service);
} catch (Exception e) {
e.printStackTrace();
}
}
public static int getNavBarHeight() {
Resources res = Utils.getApp().getResources();
int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId != 0) {
return res.getDimensionPixelSize(resourceId);
} else {
return 0;
}
}
public static void setNavBarVisibility(@NonNull final Window window, boolean isVisible) {
if (isVisible) {
window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
View decorView = window.getDecorView();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
int visibility = decorView.getSystemUiVisibility();
decorView.setSystemUiVisibility(visibility & ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
}
public static boolean isNavBarVisible(@NonNull final Window window) {
boolean isNoLimits = (window.getAttributes().flags
& WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS) != 0;
if (isNoLimits) return false;
View decorView = window.getDecorView();
int visibility = decorView.getSystemUiVisibility();
return (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
}
@TargetApi(Build.VERSION_CODES.KITKAT)
public static void setNavBarImmersive(@NonNull final Window window) {
View decorView = window.getDecorView(); window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
}