文章目录

  • 使用案例(Kotlin)
  • 工具类 StatusBarUtil

使用案例(Kotlin)

//沉浸式实现
StatusBarUtil.immersive(this)//填充View
//id:控件id
StatusBarUtil.setPaddingSmart(this, id)//状态栏字体颜色
//true:黑色
//false:白色
StatusBarUtil.darkMode(this, false)//状态栏颜色
//activity
//color(状态栏颜色值)
//alpha(透明度,取值范围 0.0f - 1.0f )
StatusBarUtil.darkMode(this, resources.getColor(R.color.color_00ff00), 0.5f)

工具类 StatusBarUtil

@SuppressWarnings("unused")
public class StatusBarUtil {public static int DEFAULT_COLOR = 0;public static float DEFAULT_ALPHA = 0;//Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 0.2f : 0.3f;public static final int MIN_API = 17;//沉浸式public static void immersive(Activity activity) {immersive(activity, DEFAULT_COLOR, DEFAULT_ALPHA);}public static void immersive(Activity activity, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {immersive(activity.getWindow(), color, alpha);}public static void immersive(Activity activity, int color) {immersive(activity.getWindow(), color, 1f);}public static void immersive(Window window) {immersive(window, DEFAULT_COLOR, DEFAULT_ALPHA);}public static void immersive(Window window, int color) {immersive(window, color, 1f);}@SuppressLint("ObsoleteSdkInt")public static void immersive(Window window, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {if (Build.VERSION.SDK_INT >= 21) {window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(mixtureColor(color, alpha));int systemUiVisibility = window.getDecorView().getSystemUiVisibility();systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;window.getDecorView().setSystemUiVisibility(systemUiVisibility);} else if (Build.VERSION.SDK_INT >= 19) {window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);setTranslucentView((ViewGroup) window.getDecorView(), color, alpha);} else if (Build.VERSION.SDK_INT >= MIN_API && Build.VERSION.SDK_INT > 16) {int systemUiVisibility = window.getDecorView().getSystemUiVisibility();systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;systemUiVisibility |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;window.getDecorView().setSystemUiVisibility(systemUiVisibility);}}//</editor-fold>//<editor-fold desc="DarkMode">public static void darkMode(Activity activity, boolean dark) {if (isFlyme4Later()) {darkModeForFlyme4(activity.getWindow(), dark);} else if (isMIUI6Later()) {darkModeForMIUI6(activity.getWindow(), dark);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {darkModeForM(activity.getWindow(), dark);}}/*** 设置状态栏darkMode,字体颜色及icon变黑(目前支持MIUI6以上,Flyme4以上,Android M以上)*/public static void darkMode(Activity activity) {darkMode(activity.getWindow(), DEFAULT_COLOR, DEFAULT_ALPHA);}public static void darkMode(Activity activity, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {darkMode(activity.getWindow(), color, alpha);}/*** 设置状态栏darkMode,字体颜色及icon变黑(目前支持MIUI6以上,Flyme4以上,Android M以上)*/public static void darkMode(Window window, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {if (isFlyme4Later()) {darkModeForFlyme4(window, true);immersive(window, color, alpha);} else if (isMIUI6Later()) {darkModeForMIUI6(window, true);immersive(window, color, alpha);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {darkModeForM(window, true);immersive(window, color, alpha);} else if (Build.VERSION.SDK_INT >= 19) {window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);setTranslucentView((ViewGroup) window.getDecorView(), color, alpha);} else {immersive(window, color, alpha);}if (Build.VERSION.SDK_INT >= 21) {window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(Color.TRANSPARENT);} else {window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}setTranslucentView((ViewGroup) window.getDecorView(), color, alpha);}//------------------------->/*** android 6.0设置字体颜色*/@RequiresApi(Build.VERSION_CODES.M)private static void darkModeForM(Window window, boolean dark) {window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(Color.TRANSPARENT);int systemUiVisibility = window.getDecorView().getSystemUiVisibility();if (dark) {systemUiVisibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;} else {systemUiVisibility &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;}window.getDecorView().setSystemUiVisibility(systemUiVisibility);}/*** 设置Flyme4+的darkMode,darkMode时候字体颜色及icon变黑* http://open-wiki.flyme.cn/index.php?title=Flyme%E7%B3%BB%E7%BB%9FAPI*/public static boolean darkModeForFlyme4(Window window, boolean dark) {boolean result = false;if (window != null) {try {WindowManager.LayoutParams e = 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(e);if (dark) {value |= bit;} else {value &= ~bit;}meizuFlags.setInt(e, value);window.setAttributes(e);result = true;} catch (Exception var8) {Log.e("StatusBar", "darkIcon: failed");}}return result;}/*** 设置MIUI6+的状态栏是否为darkMode,darkMode时候字体颜色及icon变黑* http://dev.xiaomi.com/doc/p=4769/*/@SuppressLint("PrivateApi")public static boolean darkModeForMIUI6(Window window, boolean darkmode) {Class<? extends Window> 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);extraFlagField.invoke(window, darkmode ? darkModeFlag : 0, darkModeFlag);} catch (Exception e) {e.printStackTrace();}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {darkModeForM(window, darkmode);}return true;}/*** 判断是否Flyme4以上*/public static boolean isFlyme4Later() {return Build.FINGERPRINT.contains("Flyme_OS_4")|| Build.VERSION.INCREMENTAL.contains("Flyme_OS_4")|| Pattern.compile("Flyme OS [4|5]", Pattern.CASE_INSENSITIVE).matcher(Build.DISPLAY).find();}/*** 判断是否为MIUI6以上*/@SuppressLint("PrivateApi")public static boolean isMIUI6Later() {try {Class<?> clz = Class.forName("android.os.SystemProperties");Method mtd = clz.getMethod("get", String.class);String val = (String) mtd.invoke(null, "ro.miui.ui.version.name");assert val != null;val = val.replaceAll("[vV]", "");int version = Integer.parseInt(val);return version >= 6;} catch (Exception e) {return false;}}//</editor-fold>/*** 增加View的paddingTop,增加的值为状态栏高度*/public static void setPadding(Context context, View view) {if (Build.VERSION.SDK_INT >= MIN_API) {view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + getStatusBarHeight(context),view.getPaddingRight(), view.getPaddingBottom());}}/*** 增加View的paddingTop,增加的值为状态栏高度 (智能判断,并设置高度)*/public static void setPaddingSmart(Context context, View view) {if (Build.VERSION.SDK_INT >= MIN_API) {ViewGroup.LayoutParams lp = view.getLayoutParams();if (lp != null && lp.height > 0) {lp.height += getStatusBarHeight(context);//增高}view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + getStatusBarHeight(context),view.getPaddingRight(), view.getPaddingBottom());}}/*** 增加View的高度以及paddingTop,增加的值为状态栏高度.一般是在沉浸式全屏给ToolBar用的*/public static void setHeightAndPadding(Context context, View view) {if (Build.VERSION.SDK_INT >= MIN_API) {ViewGroup.LayoutParams lp = view.getLayoutParams();lp.height += getStatusBarHeight(context);//增高view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + getStatusBarHeight(context),view.getPaddingRight(), view.getPaddingBottom());}}/*** 增加View上边距(MarginTop)一般是给高度为 WARP_CONTENT 的小控件用的*/public static void setMargin(Context context, View view) {if (Build.VERSION.SDK_INT >= MIN_API) {ViewGroup.LayoutParams lp = view.getLayoutParams();if (lp instanceof ViewGroup.MarginLayoutParams) {((ViewGroup.MarginLayoutParams) lp).topMargin += getStatusBarHeight(context);//增高}view.setLayoutParams(lp);}}/*** 创建假的透明栏*/@SuppressLint("ObsoleteSdkInt")public static void setTranslucentView(ViewGroup container, int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {if (Build.VERSION.SDK_INT >= 19) {int mixtureColor = mixtureColor(color, alpha);View translucentView = container.findViewById(android.R.id.custom);if (translucentView == null && mixtureColor != 0) {translucentView = new View(container.getContext());translucentView.setId(android.R.id.custom);ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(container.getContext()));container.addView(translucentView, lp);}if (translucentView != null) {translucentView.setBackgroundColor(mixtureColor);}}}public static int mixtureColor(int color, @FloatRange(from = 0.0, to = 1.0) float alpha) {int a = (color & 0xff000000) == 0 ? 0xff : color >>> 24;return (color & 0x00ffffff) | (((int) (a * alpha)) << 24);}/*** 获取状态栏高度*/public static int getStatusBarHeight(Context context) {int result = 24;int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");if (resId > 0) {result = context.getResources().getDimensionPixelSize(resId);} else {result = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,result, Resources.getSystem().getDisplayMetrics());}return result;}
}

Android 安卓状态栏工具类(沉浸式、字体颜色等)相关推荐

  1. Android 系统(227)---沉浸式状态栏工具类

    沉浸式状态栏工具类 沉浸式状态栏的实现原理很简单,就是将状态栏隐藏掉,然后在原来状态栏的位置添加一个和状态栏大小一模一样的View,这个View的颜色定义成和Toolbar一样的颜色就行了 在styl ...

  2. Android沉浸式状态栏工具类,一句代码轻松搞定

    Android沉浸式状态栏工具类,一句代码轻松搞定 博客原文及源码地址:http://jaeger.itscoder.com/android/2016/03/27/statusbar-util.htm ...

  3. android 工具栏沉浸 下拉,如何在Android应用中实现一个沉浸式状态栏效果

    如何在Android应用中实现一个沉浸式状态栏效果 发布时间:2020-12-08 17:04:42 来源:亿速云 阅读:151 作者:Leah 这篇文章将为大家详细讲解有关如何在Android应用中 ...

  4. android 快速开发工具类,android面试知识点

    项目地址:570622566/FastAndrUtils  简介:android 快速开发工具类 更多:作者   提 Bug   官网 标签: Fastandrutils 是一套整理修改整合的 and ...

  5. Android常用的工具类

    2019独角兽企业重金招聘Python工程师标准>>> 最新最准确内容建议直接访问原文:Android常用的工具类 主要介绍总结的Android开发中常用的工具类,大部分同样适用于J ...

  6. Android使用的工具类

    Android实用的工具类 https://github.com/AbrahamCaiJin/CommonUtilLibrary#获取app应用版本信息--appapplicationmgr

  7. 退出整个Android程序的工具类

    在实际的Android开发过程中常常有退出整个Android程序的需求,下面给大家介绍一下如何编写一个退出整个Android程序的工具类 package com.superGao.exitApp; i ...

  8. Android软键盘工具类

    Android软键盘工具类 public class SoftKeyboardUtils {/*** 隐藏或显示软键盘* 如果现在是显示调用后则隐藏 反之则显示*/public static void ...

  9. android 单位转换工具,Android单位转换工具类

    Android单位转换工具类 Android单位转换工具类主要由以下4部分构成 1.这个类不能被初始化 2.dip转px接口 3.sp转px接口 4.px转dip接口 代码如下: import and ...

最新文章

  1. 《OpenCV3编程入门》学习笔记6 图像处理(五)漫水填充
  2. 大神打造生态链,从F2全网通开始
  3. Machine Learning week 11 quiz: Application: Photo OCR
  4. 提升.NET应用程序启动速度
  5. @RequestParam详解
  6. 想了解Webpack,看这篇就够了
  7. 数仓系列 | Flink 窗口的应用与实现
  8. Oracle下载安装教程—Oracle19c下载安装(每一步)
  9. 分享一个linux下的steam的rpm安装包的链接
  10. 2021年9月基因编辑/CRISPR最新研究进展
  11. RxJava模式与原理-----标准观察者与RxJava观察者
  12. 家用台式计算机硬件配置清单,台式电脑组装配置清单
  13. 计算机 蓝牙鼠标卡顿,win系统蓝牙鼠标经常出现卡顿的解决方法
  14. 仿163邮箱上传多附件,有点酷
  15. k8s部署zabbix_基于k8s平台的Zabbix压力测试
  16. k8s二进制安装-3,配置ca证书
  17. 收集一些好用的搜索引擎
  18. PS动作组织工具:ActionStation2 for mac
  19. 智慧旅游构建智能化服务平台指导方案
  20. 旺财记事本(数据保存至LocalStorage)

热门文章

  1. 计算机图形基础学答案,计算机图形学基础答案全.pdf
  2. linux的基本指令--第三节
  3. 呦呦,这些代码有点臭,重构大法带你秀(SPI接口化),skr~
  4. 常熟理工学院计算机专业排名2015,2019年常熟理工学院优势专业排名及分数线
  5. 移动网络运营商显示无服务器,无线路由器忽然拨不上号,显示网络运营商远端无响应怎么处理...
  6. numpy均匀分布_Numpy的基本操作
  7. 前端八股文面试题集合
  8. 【钉钉-场景化能力包】群机器人数据报表推送
  9. mac下查看隐藏文件夹
  10. 自由职业者必备的6项技能