android沉浸式状态栏
来源:互联网 发布:国家省市区数据库 编辑:程序博客网 时间:2024/05/19 17:10
android沉浸式状态栏
public class StatusBarUtil { /** * 沉浸式状态栏 * * @param activity * @param isLightStatusBar 是否为浅色状态栏(黑色字体图标) * @param isTransStatusBar 是否为透明状态栏 */ public static void initStatusBar(Activity activity, boolean isLightStatusBar, boolean isTransStatusBar) { // 6.0以上 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 设置浅色状态栏(神色背景图标) StatusBarUtil.StatusBarLightMode(activity, isLightStatusBar); // 透明状态栏 if (isTransStatusBar) { StatusBarUtil.setTransStatusBar(activity, isLightStatusBar); } } } /** * 透明状态栏 * * @param isLightStatusBar 浅色状态栏(黑色字体、图标) */ private static void setTransStatusBar(Activity activity, boolean isLightStatusBar) { // 大于android 5.0 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = activity.getWindow(); // 清除状态 透明的状态栏| 透明导航栏 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); // 大于 android 6.0 if (isLightStatusBar && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 6.0增加了View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,这个字段就是把状态栏标记为浅色,然后状态栏的字体颜色自动转换为深色。 // 所以,如果需要浅色的状态栏,只能在Android6.0及以后的版本中实现 window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } else { window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); } // 透明状态栏 // FLAG_TRANSLUCENT_STATUS 只是把状态栏设置为透明的,但是,状态栏是有背景色的,一些手机的状态栏背景色为透明,而一些手机的状态栏背景色为半透明的黑色 // 于是在5.0上增加了WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS // getWindow().setStatusBarColor(int color) window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); } } /** * 设置状态栏黑色字体图标, * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android * * @param activity * @param dark 是否把状态栏字体及图标颜色设置为深色 * @return 1:MIUUI 2:Flyme 3:android6.0 */ private static int StatusBarLightMode(Activity activity, boolean dark) { int result = 0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (MIUISetStatusBarLightMode(activity.getWindow(), dark)) { result = 1; } else if (FlymeSetStatusBarLightMode(activity.getWindow(), dark)) { result = 2; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); result = 3; } } return result; } /** * 设置状态栏图标为深色和魅族特定的文字风格 * 可以用来判断是否为Flyme用户 * * @param window 需要设置的窗口 * @param dark 是否把状态栏字体及图标颜色设置为深色 * @return boolean 成功执行返回true */ private static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) { boolean result = false; if (window != null) { try { WindowManager.LayoutParams lp = window.getAttributes(); 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(lp); if (dark) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(lp, value); window.setAttributes(lp); result = true; } catch (Exception e) { } } return result; } /** * 设置状态栏字体图标为深色,需要MIUIV6以上 * * @param window 需要设置的窗口 * @param dark 是否把状态栏字体及图标颜色设置为深色 * @return boolean 成功执行返回true */ private static boolean MIUISetStatusBarLightMode(Window window, boolean dark) { boolean result = false; if (window != null) { Class clazz = window.getClass(); try { int darkModeFlag = 0; Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); if (dark) { extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体 } else { extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体 } result = true; } catch (Exception e) { } } return result; }}
阅读全文
0 0
- Android 沉浸式状态栏
- android 沉浸式 状态栏
- android 沉浸式状态栏
- android沉浸式状态栏
- Android沉浸式状态栏
- Android 沉浸式状态栏
- android 沉浸式状态栏
- Android沉浸式状态栏
- Android沉浸式状态栏
- Android 沉浸式状态栏
- Android沉浸式状态栏
- android 沉浸式状态栏
- android 沉浸式状态栏
- Android沉浸式状态栏
- android沉浸式状态栏
- Android 沉浸式状态栏
- android沉浸式状态栏
- Android沉浸式状态栏
- 大三,2017下半年的计划
- < 笔记 > Python
- ElasticSearch
- Property动画总结
- 三分算法
- android沉浸式状态栏
- application 对象是什么
- C++强制类型转换
- [FZU](2150)Fire Game ---bfs
- Elasticsearch基础教程
- JAVA正则表达式:Pattern类与Matcher类详解(转)
- 【算法分析与设计】【第四周】547. Friend Circles
- jsp连接MySQL数据库
- java基础关于Javac.exe与java.exe(适合与初学者)