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

2023-11-15

前言

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android透明状态栏和导航栏方案最终版 的相关文章

随机推荐

  • 安装cvxpy之后,报错The solver GLPK_MI is not installed

    安装cvxpy之后用的时候 报错The solver GLPK MI is not installed 这边我们可以用以下代码查看已经安装的下载器 print cvxpy installed solvers 在安装个cvxopt即可 pip
  • 基于SpringBoot的财务管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 Vue 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mav
  • 解决:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure(真实有效)

    数据库连接失败 一 例如我在SpringBoot项目中使用了阿里的数据库连接池Driud 有次在启动的时候 会报这样的错 Caused by com mysql cj exceptions CJCommunicationsException
  • 艺术品拍卖爬虫:使用Python抓取艺术品拍卖网站上的拍卖信息与成交价格

    目录 第2部分 爬取艺术品拍卖网站数据 2 1 确定目标网站 2 2 获取页面内容 2 3 解析网页内容
  • 学习编程有必要做笔记吗?

    小编发现W3Cschool的程序员很喜欢记笔记 桌面永远挂着个笔记软件 笔记本也写的密密麻麻的 那么做编程真的有必要做笔记吗 怎么记呢 一起来看下知乎网友怎么说 花生PeA 记不记笔记看情况 比如题主学的HTML CSS PHP 已经有十分
  • 行内元素的默认的横向边距与纵向边距

    行内元素在渲染是会默认添加右侧和底部边距 如果在多个图片排列时这种情况就比较明显 当我们需要在布局上完全无边距的时候就需要去除这些编剧 去除方法就是 在单元元素上添加下面对应的属性去除边距 去除横向边距 x noSpace font siz
  • 梯度下降法解决线性回归

    用梯度下降的优化方法来快速解决线性回归问题 import tensorflow as tf import numpy as np import matplotlib pyplot as plt import os os environ TF
  • 560. Subarray Sum Equals K

    Given an array of integers and an integer k you need to find the total number of continuous subarrays whose sum equals t
  • Java服务器授权+授权工具部分代码及思路

    目标 项目部署到服务器上 需要当前服务器授权后才能正常访问 控制项目授权日期 某终端 通道 授权数量 用户登录访问菜单权限 注 授权端 授权工具在自己手里 控制授权 在此我称之为授权工具 被授权端 jar包部署的服务器端 在此我称之为服务器
  • 大学生团体天梯赛(第十届)

    题目地址 天梯赛 include
  • 【区块链技术工坊45期】陈军:用案例解析通证经济模型设计

    1 活动基本信息 1 题目 区块链技术工坊45期 案例解析通证经济模型设计 2 议题 传统的新技术出现 人们只需要精通其语言规范和工具即可付诸应用 而区块链技术的出现却伴随着一个新的经济概念 即通证经济 有人说没有通证经济模型的区块链应用不
  • 专题:编程案例

    目录 案例一 买飞机票 代码优化 总结 案例二 求区间之内的素数 案例三 开发验证码 随机验证码的核心逻辑 案例四 评委打分 案例五 数字加密 案例六 模拟双色球系统 案例一 买飞机票 import java util Scanner pu
  • java 多线程之 implements Runnable

    请看以下题目 public class testController implements Runnable int b 100 synchronized void m1 throws InterruptedException b 1000
  • 移动端适配dpr

    1 移动端适配的代码 设计稿iPhone6 如下 function doc win seMetaTagScale doc win var fn function var deviceWidth doc documentElement cli
  • 如何用linux命令查看日志

    关注我 升职加薪就是你 压缩命令 tar czvf info log tar gz info log 把info log压缩为info log tar gz 通常压缩率能达到20倍左右 查询压缩文件内容 zcat info log tar
  • 如何帮服务器设置虚拟内存,服务器里面怎么设置虚拟内存

    服务器里面怎么设置虚拟内存 内容精选 换一换 对象存储调优主要分为 冷存储配置调优所有数据盘都是机械硬盘 HDD 的场景 即DB WAL分区 元数据存储池都使用机械硬盘所有数据盘都是机械硬盘 HDD 的场景 即DB WAL分区 元数据存储池
  • binlog_do_db 与 binlog_ignore_db

    前言 经过前面文章学习 我们知道 binlog 会记录数据库所有执行的 DDL 和 DML 语句 除了数据查询语句select show等 注意默认情况下会记录所有库的操作 那么如果我们有另类需求 比如说只让某个库记录 binglog 或排
  • [羊城杯 2020]A Piece Of Java

    羊城杯 2020 A Piece Of Java 文章目录 羊城杯 2020 A Piece Of Java 源码分析 从后往前测试 逐步写exp 构造DatabaseInfo类对象 InfoInvocationHandler 动态代理 序
  • 树莓派配置motion获取实时视频流

    一 串口连接CSI摄像头模块 二 升级安装程序apt get 输入以下命令 sudo apt get update sudo apt get upgrade 三 激活树莓派摄像头模块 输入sudo raspi config 选择Interf
  • Android透明状态栏和导航栏方案最终版

    前言 仔细留意常用App 就会发现有些 App 的状态栏和导航栏有透明效果 或者是沉浸式效果 比如QQ音乐客户端 是像这个样子的 我们看到整个页面顶部与导航栏浑然一体 在看导航栏 虽然我们打开了手机导航栏 但是整个页面 还是延伸到了导航栏底