美文网首页UI效果view相关重点干货
Android透明状态栏和导航栏方案最终版

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

作者: GameProgramer | 来源:发表于2022-07-18 18:07 被阅读0次

    前言

    仔细留意常用App,就会发现有些 App 的状态栏和导航栏有透明效果,或者是沉浸式效果,比如QQ音乐客户端,是像这个样子的

    QQ音乐.png

    我们看到整个页面顶部与导航栏浑然一体,
    在看导航栏,虽然我们打开了手机导航栏,但是整个页面,还是延伸到了导航栏底部,这种创意,既保证了用户操作不受影响,
    整个听歌页面,非常协调大气,也最大限度利用了屏幕空间,
    虽然只是简单的改变,但相对于传统的上下两个黑条来说,视觉效果会美观很多。

    这就是今天要介绍的技术点,Android透明状态栏和导航栏。
    Android 从4.4开始引进透明状态栏和导航栏的概念,并且在5.0进行了改进,将透明变成了半透明的效果。虽然此特性最早出现在ios,但不否认效果还是很赞的。
    至于4.4以下的手机,就不要考虑此特性了,好在4.4以下的手机份额已经非常小了。

    实现效果

    说明

    目前Android系统手机,主要有两种导航方式:手势导航与按键导航。
    这两种不同的设置,直接影响到导航栏效果展示,但是不影响状态栏效果展示,所以在实现结果上,会有2种效果图。

    手势导航-透明状态栏和导航栏效果

    手势导航.png

    按键导航-透明状态栏和导航栏效果

    按键导航.png

    核心代码

    透明状态栏

        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 : 透明导航栏

    同时BarUtils已经集成到AndroidUtilCode

    详细源码可见
    https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java

    同时非常推荐AndroidUtilCode这个库,这是一个强大易用的安卓工具类库,它合理地封装了安卓开发中常用的函数,具有完善的 Demo 和单元测试,利用其封装好的 APIs 可以大大提高开发效率。

    心得

    网上关于沉浸式的介绍铺天盖地,但是很少有人把它们封装起来,当开发者调用的时候还得自己去写大量代码,消耗大家时间。写这个BarUtils的目的就是方便大家的开发,解决大家在沉浸式方面出现的问题。如果还有不懂得地方可以直接留言。

    相关文章

      网友评论

        本文标题:Android透明状态栏和导航栏方案最终版

        本文链接:https://www.haomeiwen.com/subject/lwjdirtx.html