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

文章介绍了如何在不同Android系统版本上实现状态栏的暗黑模式,包括MIUI6、Flyme4和AndroidM及以上版本,涉及设置透明度、字体颜色和图标颜色的调整,以及对沉浸式状态栏的处理。
摘要由CSDN通过智能技术生成

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

}

/**

  • 判断是否为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;

}

}

//

/**

  • 增加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());

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

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

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

img

img

img

img

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

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

总结:

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • BAT大厂面试题、独家面试工具包,

  • 资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

g" />

总结:

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • BAT大厂面试题、独家面试工具包,

  • 资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,

    [外链图片转存中…(img-nKczLwcY-1711547832626)]
    [外链图片转存中…(img-fy7iDQee-1711547832626)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值