前言
仔细留意常用App,就会发现有些 App 的状态栏和导航栏有透明效果,或者是沉浸式效果,比如QQ音乐客户端,是像这个样子的
我们看到整个页面顶部与导航栏浑然一体,
在看导航栏,虽然我们打开了手机导航栏,但是整个页面,还是延伸到了导航栏底部,这种创意,既保证了用户操作不受影响,
整个听歌页面,非常协调大气,也最大限度利用了屏幕空间,
虽然只是简单的改变,但相对于传统的上下两个黑条来说,视觉效果会美观很多。
这就是今天要介绍的技术点,Android透明状态栏和导航栏。
Android 从4.4开始引进透明状态栏和导航栏的概念,并且在5.0进行了改进,将透明变成了半透明的效果。虽然此特性最早出现在ios,但不否认效果还是很赞的。
至于4.4以下的手机,就不要考虑此特性了,好在4.4以下的手机份额已经非常小了。
实现效果
目前Android系统手机,主要有两种导航方式:手势导航与按键导航。
这两种不同的设置,直接影响到导航栏效果展示,但是不影响状态栏效果展示,所以在实现结果上,会有2种效果图。
手势导航-透明状态栏和导航栏效果
按键导航-透明状态栏和导航栏效果
核心代码
透明状态栏
public static void transparentStatusBar(@NonNull final Activity activity) {
transparentStatusBar(activity.getWindow());
}
public static void transparentStatusBar(@NonNull final Window window) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
int option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
int vis = window.getDecorView().getSystemUiVisibility();
window.getDecorView().setSystemUiVisibility(option | vis);
window.setStatusBarColor(Color.TRANSPARENT);
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
透明导航栏
public static void transparentNavBar(@NonNull final Activity activity) {
transparentNavBar(activity.getWindow());
}
public static void transparentNavBar(@NonNull final Window window) {
if (Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) return;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
window.setNavigationBarContrastEnforced(false);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setNavigationBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if ((window.getAttributes().flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) == 0) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
}
View decorView = window.getDecorView();
int vis = decorView.getSystemUiVisibility();
int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(vis | option);
}
结语
由于StatusBar与NavigationBar平时开发接触很多,所以我们把StatusBar与NavigationBar非常常用的各种操作,已经统一集成到
BarUtils。
常见的API如
getStatusBarHeight : 获取状态栏高度(px)
setStatusBarVisibility : 设置状态栏是否可见
isStatusBarVisible : 判断状态栏是否可见
setStatusBarLightMode : 设置状态栏是否为浅色模式
isStatusBarLightMode : 判断状态栏是否为浅色模式
addMarginTopEqualStatusBarHeight : 为 view 增加 MarginTop 为状态栏高度
subtractMarginTopEqualStatusBarHeight : 为 view 减少 MarginTop 为状态栏高度
setStatusBarColor : 设置状态栏颜色
setStatusBarColor4Drawer : 为 DrawerLayout 设置状态栏颜色
transparentStatusBar : 透明状态栏
getActionBarHeight : 获取 ActionBar 高度
setNotificationBarVisibility : 设置通知栏是否可见
getNavBarHeight : 获取导航栏高度
setNavBarVisibility : 设置导航栏是否可见
isNavBarVisible : 判断导航栏是否可见
setNavBarColor : 设置导航栏颜色
getNavBarColor : 获取导航栏颜色
isSupportNavBar : 判断是否支持导航栏
setNavBarLightMode : 设置导航栏是否为浅色模式
isNavBarLightMode : 判断导航栏是否为浅色模式
transparentNavBar : 透明导航栏