android沉浸式状态栏、变色状态栏、透明状态栏、修改状态栏颜色及透明

2024-06-18 07:48

本文主要是介绍android沉浸式状态栏、变色状态栏、透明状态栏、修改状态栏颜色及透明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先我要区分清楚沉浸式状态栏与变色状态栏。

沉浸式状态栏指的是,状态栏隐藏,在手指做了相关操作后,状态栏显示出来,例如视频播放器,在播放视频时是隐藏状态栏的,但是点击屏幕的时候,状态栏会显示出来,再例如文本阅读器,在阅读的时候是全屏的,然后从屏幕上方下滑或者下方上划,虚拟键和状态栏出现了,但却是直接覆盖在程序文字上的,这是所谓的沉浸式状态栏。
那么大家平时所说的状态栏与导航栏颜色相同,或者透明,指的是变色状态栏,或者透明状态栏。
对于这两个概念的理解,大家可以参考http://www.androidchina.net/3520.html。

v19(4.4)以后开始支持android:windowTranslucentStatus属性,透明状态栏,而v21(5.0)以后出现变色状态栏,可以自由设置状态栏颜色。
通过这两个新特性,可以帮助我们快速的实现4.4以后的状态栏与app的导航栏颜色相同。

实现变色导航栏主要是通过styles里面的theme来实现的:

<resources><style name="AppTheme.Base" parent="Theme.AppCompat.Light"><item name="windowActionBar">false</item><item name="windowNoTitle">true</item></style><style name="BaseAppTheme" parent="AppTheme.Base"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style><!-- Base application theme. --><style name="AppTheme" parent="BaseAppTheme"/>
</resources>

首先,在 “values\styles.xml” 中定义一个最基础的theme,AppTheme.Base,该主题继承于AppCompat.Light主题,因为本例子中使用了toolbar(谷歌已经建议用toolbar取代actionbar),因此该主题的主要目的是用于隐藏自带的actionBar,以及设置不显示title。

<style name="AppTheme.Base" parent="Theme.AppCompat.Light"><item name="windowActionBar">false</item><item name="windowNoTitle">true</item>
</style>

接下来定义主题BaseAppTheme,继承于上面定义的AppTheme.Base主题,该主题定义了三个颜色,分别指定状态栏、toolbar和页面中重点控件的颜色(颜色自己去定义)。

<style name="BaseAppTheme" parent="AppTheme.Base"><item name="colorPrimary">@color/colorPrimary</item>    <!-- 状态栏 --><item name="colorPrimaryDark">@color/colorPrimaryDark</item> <!-- toolbar --><item name="colorAccent">@color/colorAccent</item>  <!-- 重点 -->
</style>

对于AppCompat主题中,各个颜色属性的含义,可以参考下图

这里写图片描述

然后定义一个AppTheme,继承于BaseAppTheme,

<style name="AppTheme" parent="BaseAppTheme"/>

在AndroidManifest.xml里application标签下设置主题 android:theme="@style/AppTheme"

到此,对于4.4以下的系统,会使用values\styles.xml中的AppTheme主题,那么在4.4跟5.0这两个系统下,我们要做以下的处理。

4.4:新建“values-v19\styles.xml”

在里面定义适用与4.4系统的AppTheme,在4.4系统中提出的是透明状态栏,因此这里我们定义一个AppTheme继承于BaseAppTheme,其中只要实现透明状态栏,代码如下:

<style name="AppTheme" parent="BaseAppTheme"><item name="android:windowTranslucentStatus">true</item>
</style>

5.0:新建“values-v21\styles.xml”

在里面定义适用与5.0系统的AppTheme,在5.0系统中提出的变色状态栏,因此这里我们只需定义一个AppTheme继承于BaseAppTheme代码如下:

<style name="AppTheme" parent="BaseAppTheme"/>

注意在布局文件中要设置如下属性,根据其字面意思,理解为,是否适应系统窗口,当设为true的时候,适应系统窗口,布局时会考虑状态栏的存在;如果设为false,则不考虑状态栏的存在,全屏显示,状态栏出现在布局上层,可参考下面效果图。
android:fitsSystemWindows=”true”

设为true:
这里写图片描述

设为false:
这里写图片描述

完成以上设置以后,就可以达到在4.4系统以上自定义状态栏、导航栏等颜色的目的。

状态栏透明

上面研究的是状态栏与导航栏颜色的设置,那么如何实现上图所示的,状态栏、导航栏透明,背景图片全屏显示的呢?
按道理想,既然可以设导航栏的颜色,那么我直接把颜色设成透明色,是不是就可以了呢?
答案是,正解~

不过,还是要处理一些特殊情况。

首先,我们把styles中的颜色设为透明,然后在主页面根布局下,设置一个背景图和设置 android:fitsSystemWindows=”true” 属性

<style name="BaseAppTheme" parent="AppTheme.Base"><!-- Customize your theme here. --><item name="colorPrimary">@color/transparence</item>    <!-- 状态栏 --><item name="colorPrimaryDark">@color/transparence</item> <!-- toolbar --><item name="colorAccent">@color/colorAccent</item>  <!-- 重点 -->
</style>

运行的结果是,在4.4系统上,完全正常显示,而在5.0上,toolbar正常显示了透明色,但是状态栏显示的是灰色透明色
4.4系统:
这里写图片描述

5.0系统:
这里写图片描述
原因应该是,4.4系统支持的就是透明状态栏,所以只需要将状态栏颜色设为透明,即可到达效果。
而5.0支持的是变色状态栏,得到的效果与我们预期不同,特做如下处理:

在代码中设置,判断当sdk大于等于5.0时,执行以下代码

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Window window = getWindow();window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(Color.TRANSPARENT);
}

运行后,在4.4以及5.0系统上都能实现透明效果了,效果图如下:
这里写图片描述

源码下载

这篇关于android沉浸式状态栏、变色状态栏、透明状态栏、修改状态栏颜色及透明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071692

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名