Android 实现沉浸式状态栏(包含顶部栏吸顶Layout CoordinatorLayout实现沉浸式状态栏)

本文主要是介绍Android 实现沉浸式状态栏(包含顶部栏吸顶Layout CoordinatorLayout实现沉浸式状态栏),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

Android状态栏默认是固定的黑底白字,这肯定是不被伟大的设计师所喜爱的,更有甚者,某些时候设计希望内容能够延伸到状态栏上部(例如顶部是大图的情况)。所幸的是随着Android版本的迭代,开发者对状态栏等控件有了更多的控制。Android一直在尝试引入新的Api来满足开发者的需求,但Api却一直不够完美,函数添加了很多,却都不够简单或者说完美,算上第三方厂商的特色行为,怎一个“乱”字了得。

Android 完美的沉浸式需要多个函数配合使用才能完成,我们这里可以直接使用ImmersionBar 框架来实现沉浸式状态栏。

这里分为两部分:第一部分是普通的Layout实现沉浸式状态栏(如:FrameLayout、LinearLayout、RelativeLayout、ConstraintLayout),

第二部分是特殊的Layout实现沉浸式状态栏(如:CoordinatorLayout实现沉浸式状态栏)。

1.引入immersionbar依赖,在app的build.gradle中添加依赖

    //沉浸式状态栏框架导入// 基础依赖包,必须要依赖api "com.geyifeng.immersionbar:immersionbar:3.2.2"// kotlin扩展(可选)api "com.geyifeng.immersionbar:3.2.2"

在项目的build.gradle下的repositories添加(新版本Android Studio创建的项目是在settings.gradle下的repositories),并同步项目。

mavenCentral()

关于全面屏

在manifest的application节点下加入

<meta-data android:name="android.max_aspect"android:value="2.4" />

关于刘海屏

在manifest的application节点下加入

   <!--适配华为(huawei)刘海屏--><meta-data android:name="android.notch_support" android:value="true"/><!--适配小米(xiaomi)刘海屏--><meta-dataandroid:name="notch.config"android:value="portrait|landscape" />

2.普通的Layout实现沉浸式状态栏。

1)在res文件夹下的values文件夹下的styles.xml文件内加入

    <!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><item name="android:windowContentOverlay">@null</item><item name="android:windowBackground">@android:color/white</item></style>

然后在manifest的application节点上加入android:theme="@style/AppTheme"(也可以在activity节点上加入,但是这样一来每个用到沉浸式状态栏的Activity都要加一下这个属性了),如下图一

2)在xml写一个标题栏Layout,不要给外层Layout设置android:fitsSystemWindows="true"属性,然后配置了第3步这个标题栏Layout就能够延伸到状态栏底部。

        <androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="@dimen/dp_73"android:background="@color/color_FF198CFF"android:minHeight="?attr/actionBarSize"android:orientation="vertical"app:contentInsetStart="0dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/dp_73"android:orientation="vertical"><Viewandroid:layout_width="match_parent"android:layout_height="@dimen/dp_25" /><FrameLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/dp_48"><FrameLayoutandroid:id="@+id/layout_back"android:layout_width="@dimen/dp_36"android:layout_height="match_parent"android:gravity="start"tools:ignore="UselessParent"><ImageViewandroid:id="@+id/imv_back"android:layout_width="@dimen/dp_6"android:layout_height="@dimen/dp_11"android:layout_gravity="center"android:src="@mipmap/icon_arrowhead_left"tools:ignore="ContentDescription" /></FrameLayout><TextViewandroid:id="@+id/tev_title"android:layout_width="match_parent"android:layout_height="@dimen/dp_48"android:gravity="center"android:text="@string/android_and_js"android:textColor="@color/white"android:textSize="@dimen/sp_20" /></FrameLayout></LinearLayout></androidx.appcompat.widget.Toolbar>

3)封装immersionbar框架中的沉浸式状态栏方法

protected open fun setToolbar(isDarkFont: Boolean, color: Int) {if (isDarkFont) {ImmersionBar.with(this) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度.statusBarDarkFont(isDarkFont).statusBarColor(color) //状态栏颜色,不写默认透明色//                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦.init()} else {ImmersionBar.with(this).statusBarDarkFont(isDarkFont).statusBarColor(color) //状态栏颜色,不写默认透明色//                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦.init()}}
在Activity中调用这个方法(参数一:是否是深色字体的;参数二:沉浸状态栏的颜色)
setToolbar(false, R.color.color_FF198CFF)

3.第二步的方法中能实现绝大多数沉浸式状态栏,然而不能实现顶部栏吸顶Layout CoordinatorLayout的沉浸式状态栏。

下面我们来看一下CoordinatorLayout实现沉浸式状态栏

1)在res文件夹下的values文件夹下的styles.xml文件内加入

<style name="NoActionBarTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><!-- 启动白屏解决方案,这三行是重点 --><!--   设置背景,解决白屏的关键   --><!-- 将splash图片设置在这,这样这张图片取代白屏 --><item name="android:windowBackground">@drawable/picture3</item><!-- 设置状态栏为白色的,状态栏文字为黑的 --><item name="android:statusBarColor" tools:targetApi="l">@color/white</item><item name="android:windowLightStatusBar" tools:targetApi="m">true</item></style>

然后在manifest的application节点下的activity节点上加入android:theme="@style/NoActionBarTheme",如下图一

 2)在xml写一个Layout,不要给外层Layout设置android:fitsSystemWindows="true"属性,然后配置了第3步这个标题栏Layout就能够延伸到状态栏底部。

            <androidx.coordinatorlayout.widget.CoordinatorLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:clipToPadding="true"><com.google.android.material.appbar.AppBarLayoutandroid:id="@+id/app_bar_layout"android:layout_width="match_parent"android:layout_height="wrap_content"><com.google.android.material.appbar.CollapsingToolbarLayoutandroid:id="@+id/collapsing_toolbar_layout"android:layout_width="match_parent"android:layout_height="wrap_content"app:layout_scrollFlags="scroll|exitUntilCollapsed"><ImageViewandroid:id="@+id/imv_banner"android:layout_width="match_parent"android:layout_height="@dimen/dp_270"android:scaleType="centerCrop"android:src="@mipmap/picture_manami_enosawa2"tools:ignore="ContentDescription" /><androidx.appcompat.widget.Toolbarandroid:layout_width="match_parent"android:layout_height="@dimen/dp_73"app:contentInsetStart="0dp"app:layout_collapseMode="pin" /></com.google.android.material.appbar.CollapsingToolbarLayout><FrameLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/dp_50"android:orientation="vertical"tools:ignore="UselessLeaf"><net.lucode.hackware.magicindicator.MagicIndicatorandroid:id="@+id/magic_indicator"android:layout_width="wrap_content"android:layout_height="@dimen/dp_40"android:layout_gravity="center" /></FrameLayout></com.google.android.material.appbar.AppBarLayout><androidx.viewpager.widget.ViewPagerandroid:id="@+id/view_pager"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior" /></androidx.coordinatorlayout.widget.CoordinatorLayout>

3)封装immersionbar框架中的沉浸式状态栏方法

/*** 顶部栏吸顶专用*/protected open fun setToolbar2(isDarkFont: Boolean,statusBarColor: Int) {if (isDarkFont) {val window = windowwindow.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUSor WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREENor View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_LAYOUT_STABLE)window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)window.statusBarColor = Color.TRANSPARENT//        window.setNavigationBarColor(Color.TRANSPARENT);ImmersionBar.with(this) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度.statusBarDarkFont(isDarkFont).statusBarColor(statusBarColor) //状态栏颜色,不写默认透明色//                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦.keyboardEnable(true).init()} else {ImmersionBar.with(this) //原理:如果当前设备支持状态栏字体变色,会设置状态栏字体为黑色,如果当前设备不支持状态栏字体变色,会使当前状态栏加上透明度,否则不执行透明度.statusBarDarkFont(isDarkFont).statusBarColor(statusBarColor) //状态栏颜色,不写默认透明色//                    .autoStatusBarDarkModeEnable(true, 0.2f) //自动状态栏字体变色,必须指定状态栏颜色才可以自动变色哦.keyboardEnable(true).init()val window = windowwindow.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUSor WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREENor View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_LAYOUT_STABLE)window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)window.statusBarColor = Color.TRANSPARENT//        window.setNavigationBarColor(Color.TRANSPARENT);}}

在Activity中调用这个方法(参数一:是否是深色字体的;参数二:沉浸状态栏的颜色),这样就实现了CoordinatorLayout的沉浸式状态栏,如以下视频(这里的沉浸状态栏的颜色设置的完全透明,上滑的时候会渐变至纯白色)。

setToolbar2(false, R.color.color_transparent):

Android顶部栏吸顶效果


 

如对此有疑问,请联系qq1164688204。

推荐Android开源项目

项目功能介绍:原本是RxJava2和Retrofit2项目,现已更新使用Kotlin+RxJava2+Retrofit2+MVP架构+组件化和 Kotlin+Retrofit2+协程+MVVM架构+组件化,添加自动管理token 功能,添加RxJava2 生命周期管理,集成极光推送、阿里云Oss对象存储和高德地图定位功能。

项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2

这篇关于Android 实现沉浸式状态栏(包含顶部栏吸顶Layout CoordinatorLayout实现沉浸式状态栏)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

MySQL 横向衍生表(Lateral Derived Tables)的实现

《MySQL横向衍生表(LateralDerivedTables)的实现》横向衍生表适用于在需要通过子查询获取中间结果集的场景,相对于普通衍生表,横向衍生表可以引用在其之前出现过的表名,本文就来... 目录一、横向衍生表用法示例1.1 用法示例1.2 使用建议前面我们介绍过mysql中的衍生表(From子句