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节点下加入
关于刘海屏
在manifest的application节点下加入
2.普通的Layout实现沉浸式状态栏。
1)在res文件夹下的values文件夹下的styles.xml文件内加入
然后在manifest的application节点上加入android:theme="@style/AppTheme"(也可以在activity节点上加入,但是这样一来每个用到沉浸式状态栏的Activity都要加一下这个属性了),如下图一
2)在xml写一个栏Layout,不要给外层Layout设置android:fitsSystemWindows="true"属性,然后配置了第3步这个栏Layout就能够延伸到状态栏底部。
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文件内加入
然后在manifest的application节点下的activity节点上加入android:theme="@style/NoActionBarTheme",如下图一
2)在xml写一个Layout,不要给外层Layout设置android:fitsSystemWindows="true"属性,然后配置了第3步这个栏Layout就能够延伸到状态栏底部。
3)封装immersionbar框架中的沉浸式状态栏方法
protected open fun setToolbar2( isDarkFont: Boolean, statusBarColor: Int ) { if (isDarkFont) { val window = window window.clearFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS or WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION ) window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or 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 = window window.clearFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS or WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION ) window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or 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
来源地址:https://blog.csdn.net/NakajimaFN/article/details/130928483