Android 沉浸式状态栏 以及 伪沉浸式状态栏

简介:       小菜最近在调整页面状态栏的效果,主要包括沉浸式状态栏和伪沉浸状态栏(同事唠嗑给定义的玩的)。      前段时间整理过一篇 Android 沉浸式状态栏的多种样式,现在小菜在稍微的补充一下,都是在日常应用中测试整理的。

      小菜最近在调整页面状态栏的效果,主要包括沉浸式状态栏伪沉浸状态栏(同事唠嗑给定义的玩的)。
      前段时间整理过一篇 Android 沉浸式状态栏的多种样式,现在小菜在稍微的补充一下,都是在日常应用中测试整理的。


非 Toolbar 标题栏

      就小菜接触的项目中根据业务不同,不是所有的标题栏都是 Toolbar 标题栏样式,很多是自定义的标题栏样式,为了效果统一,小菜的解决方案是修改顶部状态栏的颜色为程序的主题色,戏称为伪沉浸式状态栏。
      以下是小菜自己测试的最简单的标题栏样式:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="46dp"
        android:background="@color/colorAccent"
        android:gravity="center">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center"
            android:paddingLeft="6dp"
            android:src="@mipmap/icon_back_white" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="我是标题"
            android:textColor="@android:color/white"
            android:textSize="18sp" />
    </FrameLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="我是内容"
        android:textSize="18sp" />
</LinearLayout>
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_toolbar)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        val window = window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.statusBarColor = resources.getColor(R.color.colorAccent)
        //window.statusBarColor = Color.TRANSPARENT
        //window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    }
}
图1.jpg
图2.jpg

Tips1: Window 是一个很值得研究的类,设置 statusBarColor 属性即可修改状态栏颜色。
Tips2: 若配合打开代码中注释的两行,整体的效果是隐藏掉状态栏高度,标题栏上移,如图2所示,在其他相应的场景下很有用。


Toolbar 标题栏

      小菜花了不少时间在以前的博客中,大家可以移步审查一下。现在小菜又用了一种方式,主要是为了满足实时网络更换主题图,采用 背景主题色+透明图层 方式。如果不需要来回更换图片可以直接用 layer-list 的 drawable 方式,现在需要随意更换图片,所以小菜把这主题色和透明涂层区分开。
      以下是小菜加载一张图片的 Toolbar 方式:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.roating.ace.ace06.ToolbarTestActivityK">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:gravity="center"
        android:orientation="vertical">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@mipmap/icon_bg"
            android:fitsSystemWindows="true"
            android:gravity="center" />
    </LinearLayout>
</android.support.constraint.ConstraintLayout>
override fun onCreate(savedInstanceState: Bundle?) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        val window = window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.statusBarColor = Color.TRANSPARENT
        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    }
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_toolbar_test)
}
图3.jpg

      小菜是在 Toolbar 外添加一层 LinearLayout 作为背景主题色涂层,Toolbar 添加背景图,而 Toolbar 的位置宽高等均可按需求定义,并配合上面刚提到的 Tips2 方式处理以下。


Tips1: 网上有人说 window 的设置需要放在 setContentView 加载布局文件之前,小菜特意用前后两种位置尝试,效果是一致的。
Tips2: 在使用 window.statusBarColor 时,会提示:Call requires API level 21(current min is 15):android.view.Window#setStatusBarColor,此时不建议用 @TargetApi(Build.VERSION_CODES.KITKAT) 这种方式,这样会固定一个版本,且顶部状态栏有时会修改无效,建议用如上 if方式 判断处理。


      下面是小菜的公众号,欢迎闲来吐槽~


小菜公众号
目录
相关文章
|
Android开发
android Compose中沉浸式设计、导航栏、状态栏的处理
android Compose中沉浸式设计、导航栏、状态栏的处理
1780 0
android Compose中沉浸式设计、导航栏、状态栏的处理
|
Android开发
Android沉浸式效果(隐藏标题栏)
Android沉浸式效果(隐藏标题栏)
126 0
|
XML Android开发 数据格式
Android 自定义ToolBar并沉浸式
  ToolBar是Android 5.0推出的一个新的导航控件用于取代之前的ActionBar,由于其高度的可定制性、灵活性、具有Material Design风格等优点,越来越多的App也用上了ToolBar。
1373 0
|
API Android开发
Android如何实现超级棒的沉浸式体验
原文:Android如何实现超级棒的沉浸式体验 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由brzhang发表于云+社区专栏 做APP开发的过程中,有很多时候,我们需要实现类似于下面这种沉浸式的体验。
985 0
|
Android开发 Java 数据格式
Android 补充 LayerDrawable 沉浸式状态栏
      小菜前些日子整理了两次小小的沉浸式状态栏的总结:Android 沉浸式状态栏的多种样式 和 Android 沉浸式状态栏以及伪沉浸式状态栏。今天小菜再稍稍补充一点,Java/Kotlin 代码中设置 LayerDrawable 方式实现沉浸式状态栏。
1166 0
|
Android开发
Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果
原文:Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果   需求:    手机app ,当打游戏或者全屏看视频的时候会发现这时候手机顶部的状态栏是不显示的,当我们从手机顶端向下进行滑动或手机底端向上滑动的时候,状态栏会显示出来,如果短暂的几秒时间没有操作的话,状态栏会再次隐藏。
1006 0
|
测试技术 API Android开发
Android 沉浸式风格(为毛叫沉浸式这么唬人)
一、参考 1、Android 沉浸式状态栏攻略 让你的状态栏变色吧 2、android设置状态栏颜色(沉浸式状态栏) 3、Android状态栏微技巧,带你真正理解沉浸式模式 4、android4.4以上沉浸式状态栏和导航栏实现以及Bar的其他管理 心得:看了大神们写的,告诫自己不要被沉浸式唬住,其实就是个名字而已,展现就是个风格(主要和状态栏颜色,高度,是否隐藏相关而已),千万别被绕进去。
1222 0
|
Android开发 开发工具 数据格式
Android 状态栏沉浸式的实现
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/48557055 随着Android 系统的不断更新,Android设计趋于简单便捷,所有软件的设计现在都趋于扁平化设计。
925 0
|
Android开发
Android实现沉浸式通知栏,通知栏可以根据app的颜色可改变啦
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/46547273 最近好多app都已经满足了沉浸式通知栏,所谓沉浸式通知栏:就是把用来导航的各种界面操作空间隐藏在以程序内容为主的情景中,通过相对“隐形”的界面来达到把用户可视范围最大化地用到内容本身上。
877 0
|
5天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库