Android透明状态栏和导航栏方案最终版

前言

仔细留意常用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 : 透明导航栏

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值