版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoshuxgh/article/details/80253196
现阶段不是很忙,就总结一下自己都实现过的功能。这一篇总结安卓实现沉浸式状态栏
Android4.4(API 19) - Android 5.0(API 21): 这个阶段可以实现沉浸式,但是表现得还不是很好,实现方式为: 通过FLAG_TRANSLUCENT_STATUS
设置状态栏为透明并且为全屏模式,然后通过添加一个与StatusBar 一样大小的View,将View 的 background 设置为我们想要的颜色,从而来实现沉浸式。
Android 5.0(API 21)以上版本: 在Android 5.0的时候,加入了一个重要的属性和方法 android:statusBarColor
(对应方法为 setStatusBarColor),通过这个方法我们就可以轻松实现沉浸式。也就是说,从Android5.0开始,系统才真正的支持沉浸式。
Android 6.0(API 23)以上版本:其实Android6.0以上的实现方式和Android 5.0 +是一样,为什么要将它归为一个单独重要的阶段呢?是因为从Android 6.0(API 23)开始,我们可以改状态栏的绘制模式,可以显示白色或浅黑色的内容和图标(除了魅族手机,魅族自家有做源码更改,6.0以下就能实现)
public class StatusBarUtil { // 设置状态栏透明与字体颜色 public static void setStatusBarTranslucent(Activity activity, boolean isLightStatusBar) { if (activity == null) return; Window window = activity.getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); } if (isXiaomi()) { setXiaomiStatusBar(window, isLightStatusBar); } else if (isMeizu()) { setMeizuStatusBar(window, isLightStatusBar); } } // 是否是小米手机 public static boolean isXiaomi() { return "Xiaomi".equals(Build.MANUFACTURER); } // 设置小米状态栏 public static void setXiaomiStatusBar(Window window, boolean isLightStatusBar) { Class<? extends Window> clazz = window.getClass(); try { Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); int darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); extraFlagField.invoke(window, isLightStatusBar ? darkModeFlag : 0, darkModeFlag); } catch (Exception e) { e.printStackTrace(); } } // 是否是魅族手机 public static boolean isMeizu() { try { Method method = Build.class.getMethod("hasSmartBar"); return method != null; } catch (NoSuchMethodException e) { } return false; } // 设置魅族状态栏 public static void setMeizuStatusBar(Window window, boolean isLightStatusBar) { WindowManager.LayoutParams params = window.getAttributes(); try { Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags"); darkFlag.setAccessible(true); meizuFlags.setAccessible(true); int bit = darkFlag.getInt(null); int value = meizuFlags.getInt(params); if (isLightStatusBar) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(params, value); window.setAttributes(params); darkFlag.setAccessible(false); meizuFlags.setAccessible(false); } catch (Exception e) { e.printStackTrace(); } } }