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

这篇文章介绍了StatusBarUtil库,用于在Android应用中实现沉浸式状态栏、设置状态栏颜色、字体颜色和暗黑模式,适用于不同版本的系统,如MIUI和Flyme。库函数覆盖了自API17以来的各种设备兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用案例(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);

}

}

//

//

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();

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

以下是今天给大家分享的一些独家干货:

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

以下是今天给大家分享的一些独家干货:

[外链图片转存中…(img-1GE7s0BH-1712680987586)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值