package com.fans.mvvm;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.os.Build;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.ColorInt;
import androidx.core.graphics.ColorUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class StatusBarUtil {
public final static int TYPE_MIUI = 0;
public final static int TYPE_FLYME = 1;
public final static int TYPE_M = 3;//6.0
private static StatusBarUtil statusBarUtil;
/**
* 设置状态栏和导航栏颜色,用于沉浸式布局
*
* @param
* @return
*/
public void setStatusBarAndNavigationBar(BaseActivity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
// 5.0已经支持代码修改状态栏和导航栏背景颜色,但由于6.0才可以设置状态栏字体明暗程度,所以4.4-6.0之间都要用老方法设置
// 4.4-6.0之间,设置透明状态栏,需要设置fitSystemWindow=true,此时导航栏可能会遮挡布局
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//状态栏
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 5.0以上可以直接设置状态栏颜色,6.0以后才可以设置状态栏字体亮度
// 设置状态栏颜色
activity.getWindow().setStatusBarColor(activity.getStatusBarColor());
// 设置状态栏字体亮度
setStatusBarTextLight(activity, isLightColor(activity.getStatusBarColor()));
}
// 由于8.1才可以设置导航栏字体亮度,所以大于等于8.1才可以设置导航栏颜色,否则会出bug
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1 && hasNavBar(activity)) {
// 设置导航栏颜色
activity.getWindow().setNavigationBarColor(activity.getNavigationBarColor());
// 设置导航栏字体亮度
setNavigationBarTextLight(activity, isLightColor(activity.getNavigationBarColor()));
// 必须再次设置状态栏字体亮度,否则会被导航栏字体亮度刷新掉
setStatusBarTextLight(activity, isLightColor(activity.getStatusBarColor()));
}
}
/**
* 根据导航栏背景色,设置导航栏字体明暗程度
*
* @param activity
* @param dark
* @return
*/
private boolean setNavigationBarTextLight(Activity activity, boolean dark) {
// 设置导航栏字体明暗
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setNavigationBarFontIconDark(activity, TYPE_M, dark);
} else if (OSUtils.isMiui()) {
setNavigationBarFontIconDark(activity, TYPE_MIUI, dark);
} else if (OSUtils.isFlyme()) {
setNavigationBarFontIconDark(activity, TYPE_FLYME, dark);
} else {//其他情况
return false;
}
return true;
}
return false;
}
public static StatusBarUtil getInstance() {
if (statusBarUtil == null) {
synchronized (StatusBarUtil.class) {
if (statusBarUtil == null) {
statusBarUtil = new StatusBarUtil();
}
}
}
return statusBarUtil;
}
/**
* 设置 导航栏深色浅色切换
*/
private boolean setNavigationBarFontIconDark(Activity activity, int type, boolean dark) {
switch (type) {
case TYPE_MIUI:
return setMiuiUINavigation(activity, dark);
case TYPE_FLYME:
return setFlymeUINavigation(activity, dark);
case TYPE_M:
default:
return setCommonUINavigation(activity, dark);
}
}
private boolean isLightColor(@ColorInt int color) {
return ColorUtils.calculateLuminance(color) >= 0.5;
}
/**
* 检查是否存在虚拟按键栏
*
* @param context
* @return
*/
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
private boolean hasNavBar(Context context) {
Resources res = context.getResources();//读取系统资源函数
int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");//获取资源id
if (resourceId != 0) {
boolean hasNav = res.getBoolean(resourceId);
// check override flag
String sNavBarOverride = getNavBarOverride();
if ("1".equals(sNavBarOverride)) {
hasNav = false;
} else if ("0".equals(sNavBarOverride)) {
hasNav = true;
}
return hasNav;
} else { // fallback
return !ViewConfiguration.get(context).hasPermanentMenuKey();
}
}
/**
* 判断虚拟按键栏是否重写
*
* @return
*/
private String getNavBarOverride() {
String sNavBarOverride = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
try {
Class c = Class.forName("android.os.SystemProperties");
Method m = c.getDeclaredMethod("get", String.class);
m.setAccessible(true);
sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");
} catch (Throwable e) {
}
}
return sNavBarOverride;
}
/**
* 根据状态栏背景,设置字体明暗程度
*/
private boolean setStatusBarTextLight(Activity activity, boolean dark) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setStatusBarFontIconDark(activity, TYPE_M, dark);
} else if (OSUtils.isMiui()) {
setStatusBarFontIconDark(activity, TYPE_MIUI, dark);
} else if (OSUtils.isFlyme()) {
setStatusBarFontIconDark(activity, TYPE_FLYME, dark);
} else {//其他情况
return false;
}
return true;
}
return false;
}
/**
* 设置 状态栏深色浅色切换
*/
private boolean setStatusBarFontIconDark(Activity activity, int type, boolean dark) {
switch (type) {
case TYPE_MIUI:
return setMiuiUIStatus(activity, dark);
case TYPE_FLYME:
return setFlymeUIStatus(activity, dark);
case TYPE_M:
default:
return setCommonUIStatus(activity, dark);
}
}
//设置状态栏深色浅色切换
private boolean setCommonUIStatus(Activity activity, boolean dark) {
View getDecorView = activity.getWindow().getDecorView();
if (getDecorView != null) {
int vis = getDecorView.getSystemUiVisibility();
if (dark) {
vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
} else {
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
if (getDecorView.getSystemUiVisibility() != vis) {
getDecorView.setSystemUiVisibility(vis);
}
return true;
}
return false;
}
//设置Flyme 状态栏深色浅色切换
private boolean setFlymeUIStatus(Activity activity, boolean dark) {
try {
设置沉浸式布局后,手机状态栏或导航栏出现白屏。
需积分: 0 64 浏览量
2022-06-19
06:22:27
上传
评论
收藏 4KB RAR 举报
范帅Jacky
- 粉丝: 1
- 资源: 4
最新资源
- 微软常用运行库 游戏运行库 VC++各个版本
- 微信小程序开发教程.pptx
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- 锐捷网络认证中心网络管理.pdf
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- SD8233LF是一款用于单按键触摸及接近感应开关,其用途是替代传统的机械型开关芯片IC
- 基于YOLOv5的烟雾火焰检测算法研究
- 基于STM32的联合调试侦听设备解决方案原理图PCB源文件调试工具视频(大赛作品)
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0