文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-09-12 20:48

关注

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯