此文章装载至http://www.androidchina.net/3520.html点击打开链接

一、

首先我们得了解什么是透明状态栏以及什么是沉浸式状态栏,以及其区别,国内习惯称透明状态栏为沉浸式状态栏,但是两者是有本质区别的。

先来看看什么是沉浸式模式。

Android 4.4中,沉浸式体验得到了再次强化,提供了一种“全屏模式”(Full-screen Immersive Mode)。全屏模式又分两种,一种叫后撤式 (Lean Back),另一种叫做沉浸式(Immersive)。后撤式已经在之前的系统中被广泛使用了——当你在优酷APP中观看视频时,大部分时间手指是不会去碰屏幕的。这种情况下,虚拟键和状态栏都会自动隐藏,但当你触摸屏幕的时候,它们又会出现。而新加入的沉浸式则不太一样,在沉浸式全屏状态下,对屏幕的操作并不会唤出系统栏。想要唤出系统栏,你必须从屏幕的上/下边缘向屏幕内划入。沉浸式的全屏状态更适合游戏和阅读这样的应用。

但沉浸模式和普通全屏不同点在于,沉浸模式通过下滑屏幕上方或者下方可以调出虚拟键和状态栏。

比如多看阅读,下图是在阅读时沉浸模式下全屏。

然后从屏幕上方下滑或者下方上划,虚拟键和状态栏出现了。但却是直接覆盖在程序文字上的。

而沉浸式状态栏的来源就是很多手机用的是实体按键,没有虚拟键,于是开了沉浸模式就只有状态栏消失了。于是沉浸模式成了沉浸式状态栏。

Android 4.4 一个很重要的改变就是透明系统栏.。新的系统栏是渐变透明的, 可以最大限度的允许屏幕显示更多内容, 也可以让系统栏和 Action Bar 融为一体, 仅仅留下最低限度的背景保护以免通知通知栏内容和 Action Bar 文字/图标难以识别。谷歌把这种效果称之为:Translucent Bar。

Translucent Bar 是 Android 对 Edge to Edge 尝试中的一个, 也是最容易被用户注意到的. 它的初始目的就是要最大化可视面积和淡化系统界面的存在感。

其实简单一点就是布局延伸到状态栏,状态栏背景与应用背景相同,这就是*透明状态栏*。最直接的例子就是UC浏览器的天气界面,其布局延伸到状态栏,但是状态栏与应用同背景,如图所示

但是这样有时候会把状态栏颜色变得和应用的背景颜色一样,但是实际上只是修改了状态栏的颜色,我们称它为变色状态栏

而现在大家所在用的QQ等软件,状态栏与软件颜色融为一体,其实就是变色状态栏。而小米MIUI的自带应用,也都是变色状态栏或者是透明状态栏,而并非是沉浸式状态栏。

这里我们姑且称变色状态栏为透明状态栏的一种,本篇文章就是带大家实现这种透明状态栏。

由于这种效果只有在4.4及以上有效,所以本篇文章的效果只有在4.4及以上有效。

首先应用主题

1
2
3
4
5
6
7
8
9
10
11
<resources>
    <style name="AppTheme" parent="@style/BaseTheme">
    </style>
    <style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    </style>
</resources>

然后我们在res下新建一个values-v19的目录,代表最低API为19,新建一个style.xml,下面的代码是透明状态栏的关键

1
2
3
4
5
6
7
8
<resources>
    <style name="AppTheme" parent="@style/BaseTheme">
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:windowTranslucentStatus">true</item>
    </style>
</resources>

我们禁用了系统的ActionBar,使用ToolBar代替,布局代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:fitsSystemWindows="true"
        >
    </android.support.v7.widget.Toolbar>
</LinearLayout>

细心的你会发现在Toolbar中加入了android:fitsSystemWindows=”true”属性,这就是将布局延伸到状态栏,这时候你运行一下,会发现Toolbar上移到了状态栏的位置。上移的高度刚好是状态栏的高度。

但是我们并不想它移动到上面,只是想它状态栏和Toolbar颜色一样,要怎么做的,很简单,在代码中通过setSupportActionBar设置到ActionBar的位置即可。

1
2
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);

之后的效果就是这样的。

很明显的看到,ToolBar就是之前的高度,但是状态栏也变色了。

但是我们又怎么能满足于此呢。在Android 5.0上,我们的状态栏的颜色是要比Toolbar的颜色要深的。就像这样。

我们还要进一步修饰,需要对状态栏着色,这里需要用到一个开源库SystemBarTint

加入依赖

  compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'

之后再设置布局后加入以下代码

1
2
3
SystemBarTintManager tintManager=new SystemBarTintManager(this);
tintManager.setStatusBarTintResource(R.color.colorPrimaryDark);
tintManager.setStatusBarTintEnabled(true);

最终效果就是上图所示

当然这个库里还有很多函数,具体功能自己去琢磨吧,并且其内部源码也并不复杂,建议还是看下其源码实现。

Android的沉浸式状态栏与变色状态栏详解相关推荐

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

    首先我要区分清楚沉浸式状态栏与变色状态栏. 沉浸式状态栏指的是,状态栏隐藏,在手指做了相关操作后,状态栏显示出来,例如视频播放器,在播放视频时是隐藏状态栏的,但是点击屏幕的时候,状态栏会显示出来,再例 ...

  2. Android各种沉浸式状态栏实现

    1.引入 dependencies {compile 'com.gyf.barlibrary:barlibrary:2.3.0' } 2.使用:在BaseActivity 中初始化 public ab ...

  3. Android一键沉浸式状态栏(透明状态栏)

    文章适合新手了解Android一键沉浸式状态栏.文章在编写过程中难免有疏漏和错误,欢迎大佬指出文章的不足之处:更多内容请点进

  4. Android设置状态栏颜色,沉浸式状态栏 fllutter Android设置沉浸式状态栏

    1. Android原生设置沉浸式状态栏,设置状态栏颜色,字体颜色 import android.annotation.TargetApi; import android.app.Activity; ...

  5. Android实现沉浸式状态栏(透明状态栏)(QQ和简书样式)

    本文内容大多参考网络上的Android实现沉浸式状态栏教程,由于看了太多类似文章,固在此不再一一列举出处.本文仅为我自己梳理思路和供各位看到本文的朋友参考(百度:Android沉浸式状态栏,第一页内容 ...

  6. Android实现沉浸式状态栏的那些坑

    最近项目需要实现沉浸式的状态栏,其实我在之前就了解过Android的沉浸式,发现有些棘手就放弃了,但是此次是公司的项目需要的,就花了几天把这个问题搞定了,在此记录一下,并mark几个坑. 首先,沉浸式 ...

  7. android listview ontouchlistener,Android ListView监听滑动事件的方法(详解)

    ListView的主要有两种滑动事件监听方法,OnTouchListener和OnScrollListener 1.OnTouchListener OnTouchListener方法来自View中的监 ...

  8. postgres预写式日志的内核实现详解-wal记录读取

    2019独角兽企业重金招聘Python工程师标准>>> 导读: postgres预写式日志的内核实现详解-概述 之前已经写了关于wal记录的结构.wal记录的写入的博客,流复制.PI ...

  9. Android系统性能优化(60)---LeakCanary使用详解

    Android内存优化(六)LeakCanary使用详解 1.概述 如果使用MAT来分析内存问题,会有一些难度,并且效率也不是很高,对于一个内存泄漏问题,可能要进行多次排查和对比.  为了能够简单迅速 ...

  10. [免费专栏] Android安全之数据存储与数据安全「详解」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

最新文章

  1. MAC卸载java 12.0.2
  2. react项目_保证一看就会 | 手把手教你创建一个React项目
  3. HTML5画布如何设置线的样式?
  4. 一个简单的Map Iterator性能测试
  5. ORACLE SGA问题分析
  6. iOS-给Category添加属性
  7. Linux发行版简介
  8. 免费好用的视频格式转换器是哪个呢
  9. 华为鸿蒙未来生态,华为王成录:鸿蒙生态构建成功后,未来移动产业20年将属于中国...
  10. Windows10 64位企业版 1909真机中使Wireshark可以抓取802.1q封装携带tag的数据帧
  11. 国产开源「文本-视频生成」模型!免费在线体验,一键实现视频生成自由
  12. linux全局搜索文件
  13. 为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数 escapeHtml,将<, >, , “进行转义
  14. Python判断变量的数据类型
  15. Mac 中 MySQL 的安装与卸载
  16. 混合蛙跳算法实现步骤与例子
  17. iOS CocoaPods第三方库加载本地文件或服务器上的zip文件(二)
  18. 记一次阿里电话面试| 技术征文
  19. 19年一些微小的计划
  20. echarts地图随意绘制点

热门文章

  1. Ubuntu常用快捷键
  2. KVM嵌套虚拟化 -- 在虚拟机中创建虚拟机
  3. python生成验证码
  4. linux恢复出厂设置_怎么恢复tp-link路由器出厂设置 恢复tp-link出厂设置方法【详解】...
  5. vue怎么引入外网json文件
  6. centos7安装配置ELK(Elasticsearch+Logstash+Kibana)
  7. Android渲染机制和丢帧分析
  8. Ubuntu中apache+php+sql搭建/卸载
  9. context:annotation-config / 和context:component-
  10. hibernate的异常 Session was already closed