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

本文介绍了StatusBarUtil工具类,用于设置Android设备上状态栏的颜色、透明度以及实现沉浸式效果,同时支持MIUI6、Flyme等系统的darkMode功能。
摘要由CSDN通过智能技术生成

//状态栏颜色

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

}

/**

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

最后

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

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

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

img

img

img

img

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

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

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-wrAP1dT6-1714946332655)]

[外链图片转存中…(img-Xmk0Qd4e-1714946332656)]

[外链图片转存中…(img-BEjBc6mT-1714946332656)]

[外链图片转存中…(img-K0rUN38M-1714946332656)]

[外链图片转存中…(img-Gg03vGDf-1714946332657)]

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

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

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值