修改状态栏和导航栏
2020-08-25 本文已影响0人
魔女小姐的猫
依赖
implementation 'com.m.k:system-ui:1.0.0-alpha01'
使用方法
SystemBarConfig config = new SystemBarConfig(this).enterFullScreen(SystemBarConfig.MODE_HIDE_LEAN_BACK);
config.apply();
方法
方法 | 作用 | |
---|---|---|
setStatusBarColor(int color) | 给状态栏设置指定的颜色 | |
setStatusBarLightMode(boolean lightMode) | 设置状态栏的的模式。 非小米和魅族手机只有 android 6.0 才开始支持,小米和 魅族 4.4 以上即可支持。 true 表示亮色模式,对应的状态栏字体和图标就会变为灰色,反之 false 字体和图标变成白色 | |
setContentBehindStatusBar(boolean behind) | true 表示内容在状态栏后面(不是下面)。false 相反。(注意: 如果 状态栏被设置为隐藏 hideStatusBar = true,并且设置了 Immersive sticky 模式,那么该方法将会失去作用 默认为contentBehindStatusBar = true 的效果 ) | |
setNavBarColor(int color) | 给底部导航栏设置指定的颜色,导航栏的隐藏模式设置了 immersive sticky ,导航栏颜色无法修改。 | |
setContentBehindNavBar(boolean behind) | true 表示内容在导航栏后面(不是下面)。false 相反。 注意:1. 如果一旦设置了该属性为true, 系统会自动设置内容也在状态栏后面,即设置 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 2. 如果 导航栏被设置为隐藏 hideNavBar = true,并且设置了 Immersive sticky 模式,那么该方法将会失去作用。默认为contentBehindNavBar = true 的效果 | |
setHideMode(int mode) | 隐藏系统UI(状态栏 + 导航栏)一共有三种模式:1. Lean back 。 用户按屏幕任意位置, 系统UI 显示。如果再想显示,必须重新调用隐藏方法才能再次隐藏。2. Immersive . 用户按下状态栏并且往下滑动,或者按下导航啦网上滑动 才能显示 system ui,显示后必须重新调用隐藏方法才能再次隐藏。3. Immersive sticky 和 第二种模式一样,只是 几秒种后会自动再次隐藏,并且设置为false 无效 | |
setHideStatusBar(boolean hide) | 是否隐藏状态栏 。true 隐藏,false 不隐藏 | |
setHideNavBar(boolean hide) | 是否隐藏底部导航栏。true 隐藏,false 不隐藏 | |
keepLayoutStable(boolean stable) | 是否保持布局稳定,当 状态栏和导航栏在显示和隐藏状态之间切换时,是否保持布局大小不变。 |
注:沉浸式模式下,修改状态栏和导航栏颜色无效。如果模式为该模式,有一下情况:
- 如果 设置了 hideStatusBar = true , 那么 contentBehindStatusBar 默认为true, 即使调用 contentBehindStatusBar(false) 也没用
- 如果 设置了 hideNavBar = true ,那么 contentBehindNavBar 默认为true ,即使调用了 contentBehindNavBar(false) 也没用
SystemBarConfig类
package com.m.k.systemui;
import android.app.Activity;
import com.m.k.systemui.uitils.Logger;
import com.m.k.systemui.uitils.SystemFacade;
public class SystemBarConfig {
// https://developer.android.google.cn/training/system-ui/immersive
public static final int MODE_IMMERSIVE = 0x101;
// 并且该模式下即使 contentBehindStatusBar 和 contentBehindNavBar 为false,一旦 导航栏显示时,内容也是在导航栏后面。这点和 其他两个模式不一样。
/**
* 该模式下 修改状态栏和导航栏颜色无效,
* 如果模式为该模式,有一下情况:
* 1. 如果 设置了 hideStatusBar = true , 那么 contentBehindStatusBar 默认为true, 即使调用 contentBehindStatusBar(false) 也没用
* 2. 如果 设置了 hideNavBar = true ,那么 contentBehindNavBar 默认为true ,即使调用了 contentBehindNavBar(false) 也没用
*/
public static final int MODE_IMMERSIVE_STICKY = 0x103;
public static final int MODE_HIDE_LEAN_BACK = 0x104;
public static final int NO_COLOR = -2;
private Activity activity;
private int statusBarColor = NO_COLOR;
private int navBarColor = NO_COLOR;
private boolean contentBehindStatusBar = false;
private boolean contentBehindNavBar = false;
// true 状态栏字体为黑色,false 状态栏字体为白色
private boolean statusBarLightMode = false;
private boolean hideStatusBar = false;
private boolean hideNavBar = false;
private boolean isKeepLayoutStable = false;
private int hideMode = MODE_HIDE_LEAN_BACK;
private boolean isUseNotch = true;
private boolean isHideSystemUi;
public SystemBarConfig(Activity activity) {
this.activity = activity;
}
/**
* 给状态栏设置指定的颜色
* @param color
* @return
*/
public SystemBarConfig setStatusBarColor(int color) {
this.statusBarColor = color;
return this;
}
/**
* 设置状态栏的的模式。 非小米和魅族手机只有 android 6.0 才开始支持,小米和 魅族 4.4 以上即可支持
* @param lightMode true 表示亮色模式,对应的状态栏字体和图标就会变为灰色,反之 false 字体和图标变成白色
* @return
*/
public SystemBarConfig setStatusBarLightMode(boolean lightMode) {
this.statusBarLightMode = lightMode;
return this;
}
/**
*
* @param behind : true 表示内容在状态栏后面(不是下面)。false 相反.
* 注意: 如果 状态栏被设置为隐藏 hideStatusBar = true,并且设置了 Immersive sticky 模式,那么该方法将会失去作用 默认为contentBehindStatusBar = true 的效果
* @return
*/
public SystemBarConfig setContentBehindStatusBar(boolean behind) {
this.contentBehindStatusBar = behind;
return this;
}
/**
* 给底部导航栏设置指定的颜色,导航栏的隐藏模式设置了 immersive sticky ,导航栏颜色无法修改。
* @param color
* @return
*/
public SystemBarConfig setNavBarColor(int color){
this.navBarColor = color;
return this;
}
/**
*
* @param behind : true 表示内容在导航栏后面(不是下面)。false 相反
* 注意:1. 如果一旦设置了该属性为true, 系统会自动设置内容也在状态栏后面,即设置 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
* 2. 如果 导航栏被设置为隐藏 hideNavBar = true,并且设置了 Immersive sticky 模式,那么该方法将会失去作用。默认为contentBehindNavBar = true 的效果
* @return
*/
public SystemBarConfig setContentBehindNavBar(boolean behind){
this.contentBehindNavBar = behind;
if(behind){
Logger.w("让内容显示在导航栏的后面,会默认自动设置内容也显示在状态栏后面");
}
return this;
}
/**
* 隐藏系统UI(状态栏 + 导航栏)一共有三种模式,<p />
*
* 1. Lean back 。 用户按屏幕任意位置, 系统UI 显示。如果再想显示,必须重新调用隐藏方法才能再次隐藏 <p />
* 2. Immersive . 用户按下状态栏并且往下滑动,或者按下导航啦网上滑动 才能显示 system ui,显示后必须重新调用隐藏方法才能再次隐藏<p />
* 3. Immersive sticky 和 第二种模式一样,只是 几秒种后会自动再次隐藏,
* 并且设置为false 无效
*
* @param mode
* @return
*/
public SystemBarConfig setHideMode(int mode){
this.hideMode = mode;
return this;
}
/**
* 是否隐藏状态栏
* @param hide ,true 隐藏,false 不隐藏
* @return
*/
public SystemBarConfig setHideStatusBar(boolean hide){
this.hideStatusBar = hide;
return this;
}
/**
* 是否隐藏底部导航栏
* @param hide ,true 隐藏,false 不隐藏
* @return
*/
public SystemBarConfig setHideNavBar(boolean hide){
this.hideNavBar = hide;
return this;
}
/**
* 是否保持布局稳定,当 状态栏和导航栏在显示和隐藏状态之间切换时,是否保持布局大小不变。
* @param stable
* @return
*/
public SystemBarConfig keepLayoutStable(boolean stable){
this.isKeepLayoutStable = stable;
return this;
}
public SystemBarConfig enterFullScreen(int mode){
isHideSystemUi =true;
hideMode = mode;
return this;
}
public SystemBarConfig existFullScreen(){
contentBehindNavBar =true;
contentBehindStatusBar = true;
isUseNotch = true;
return this;
}
public SystemBarConfig setUseNotch(boolean useNotch) {
isUseNotch = useNotch;
return this;
}
boolean isUseNotch() {
return isUseNotch;
}
int getNavBarColor() {
return navBarColor;
}
boolean isContentBehindNavBar() {
return contentBehindNavBar;
}
boolean isHideStatusBar() {
return hideStatusBar;
}
boolean isHideNavBar() {
return hideNavBar;
}
int getHideMode() {
return hideMode;
}
boolean isKeepLayoutStable(){
return isKeepLayoutStable;
}
public void apply() {
if(isHideSystemUi){ // 只要设置了进入全屏,强制设置一下值得行为
hideStatusBar = true;
hideNavBar = true;
contentBehindNavBar =true;
contentBehindStatusBar = true;
isUseNotch =true;
if(getHideMode() == MODE_IMMERSIVE_STICKY){
statusBarColor = NO_COLOR;
navBarColor = NO_COLOR;
}
}
ISystemUiAdapter statusBarAdapter = null;
if (SystemFacade.hasP()) {
statusBarAdapter = new PieUiAdapter(this);
} else if (SystemFacade.hasO()) {
statusBarAdapter = new OreoUiAdapter(this);
} else if (SystemFacade.hasM()) {
statusBarAdapter = new MarshmallowUiAdapter(this);
} else if (SystemFacade.hasLollipop()) {
statusBarAdapter = new LollipopUIAdapter(this);
} else if (SystemFacade.hasKitKat()) {
statusBarAdapter = new KitKatUiAdapter(this);
}
if (statusBarAdapter != null) {
statusBarAdapter.apply();
}
}
Activity getActivity() {
return activity;
}
int getStatusBarColor() {
return statusBarColor;
}
boolean isContentBehindStatusBar() {
return contentBehindStatusBar;
}
boolean isStatusBarLightMode() {
return statusBarLightMode;
}
public static SystemBarConfig create(Activity activity){
return new SystemBarConfig(activity);
}
}