美文网首页Android技术知识android开发杂识
沉浸式,透明式,可变状态栏解读

沉浸式,透明式,可变状态栏解读

作者: 浪够_ | 来源:发表于2017-05-27 19:54 被阅读222次

最近项目需求中需要对statusBar做透明穿透处理,刚开始没想太多,随着开发进行,发现坑位那绝对是满满的,主要就是要对不同的API进行适配,很难做到多平台的兼顾。

android的状态栏有三种不同状态,分别是:
  • 沉浸式状态栏
  • 透明状态栏(又可分为“半透明”和“全透明”)(API>=19)
  • 变色状态栏(API>=21)

沉浸式状态栏指的是,状态栏隐藏,在手指做了相关操作后,状态栏显示出来,例如视频播放器,在播放视频时是隐藏状态栏的,但是点击屏幕的时候,状态栏会显示出来,再例如文本阅读器,在阅读的时候是全屏的,然后从屏幕上方下滑或者下方上划,虚拟键和状态栏出现了,但却是直接覆盖在程序文字上的,这是所谓的沉浸式状态栏,而我们经常把沉浸和透明混为一谈,其实是有本质区别的。

半透明状态栏

Android4.4(API 19)以后才开始支持Android:windowTranslucentStatus属性,需要注意的是,TranslucentStatus属性虽然是从4.4开始支持的,但在 4.4 和 5.x 上的表现不同,不过都可以概括为一种半透明,4.4 是一层渐变的遮罩层,样子是这样的:

bantouming.png

而5.x 以上是一条半透明的遮罩层,样子是这样的:

zhezhao.png

可以看到Android:windowTranslucentStatus属性无论在4.4上还是5.0上都做不到全透明,不过后来发现有的个别手机ROM厂商,不太按套路出牌,比如这个华为ROM,在其5.0上通过这个属性就可以做到全透明,但是我还是发现了它支持的并不稳定,偶尔还是出现个半透明条,所以,还是按API要求来干事,两个字——保险

全透明状态栏

通过上面的分析,可知通过属性Android:windowTranslucentStatus并不能做的真正做到状态栏的全透明,想实现全透明就需要靠另外一个属性了——Android:statusBarColor,是的,这个同时也是下面要讲的变色状态栏要用到的,所以,往下看~~~

变色状态栏

这个是v21(5.0)以后才开始支持,主要通过Android:statusBarColor进行设置,通过它可以自由设置状态栏颜色,当然包括透明色,所以在5.0之后才能实现statusBar全透明

到此,以上是对statusBar三种样式的状态介绍,从介绍中不难得出至少两个结论:

  • 第一,对于在5.0以下的系统里如果想实现statusbar全透明是做不到的。

  • 第二,就是在5.0以上系统里实现statusbar全透明有两种方式,一种我称为 “伪透明” 即假的透明,另一种就是 “真透明” 了。

伪透明状态栏

伪透明指状态栏是有背景颜色的,而并非透明状态,只不过是通过Android:statusBarColor属性把statusbarde的颜色设置的和状态栏下面的View的颜色一样了,这和真透明状态栏的主要区别就是此时界面中的view显示是在statusbar下面的,并没有延伸到statusbar的顶部。

真透明状态栏

真透明状态栏区别于上面的伪状态栏就不用说了,它通过把Android:statusBarColor属性设置为透明,而且一个不能忘记的是需要同时设置layout布局延伸到屏幕顶部,否则statusbar透出的背景就是window的根布局的背景颜色了,也即是DecorView的颜色。设置布局延伸到顶部的相关代码:

  Window window = getWindow();
  int originStatus = window.getDecorView().getSystemUiVisibility();
  int deStatus = originStatus | 
  View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
  window.getDecorView().setSystemUiVisibility(deStatus);

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN这个flag就是控制让你的布局延伸到屏幕顶部,此时statusbar会覆盖在布局上面,它和View.SYSTEM_UI_FLAG_FULLSCREEN很相似,可自行查看相关含义。

看到这,感觉也就这么多东西,没什么难得啊,直接写不得了,是不是忽略了statusbar上面显示的内容了呢,android中默认的statusbar样式基本是黑色或者灰色背景,然后里面的内容是白色,有的说了既然statusbar的背景颜色可以设置了,内容不也有个属性android:windowLightStatusBar可以控制颜色呢,确实,可以通过这个属性来改变statusbar上内容的颜色,但是这个api是android6.0以后才有的,这就尴尬了,statusbar的颜色在5.0以上的系统都可以改变,但是它上面内容的颜色只有在6.0以上的系统才能控制,那么在5.0和6.0之间的系统,就会很容易发生下面这种场景:

  • statusbar的颜色需要设置成白色或者说statusbar穿透的背景是白色了,而statusbar上的内容默认也是白色

此时对于在5.0和6.0之间的系统遇到以上这种情况不就悲催了,而且你是无法去完美适配的,除非你的app不讲究一致性和协调美,因为google没给你方法,唉。

相关文章

  • 沉浸式,透明式,可变状态栏解读

    最近项目需求中需要对statusBar做透明穿透处理,刚开始没想太多,随着开发进行,发现坑位那绝对是满满的,主要就...

  • 沉浸式,透明式,可变状态栏解读

    最近项目需求中需要对statusBar做透明穿透处理,刚开始没想太多,随着开发进行,发现坑位那绝对是满满的,主要就...

  • AndroidView

    Android 沉浸式 (透明) 状态栏适配 Android 沉浸式状态栏仿淘宝、京东拖拽商品详情(可嵌套View...

  • 刨根问底-论Android“沉浸式”

    网上谈论“沉浸式”的文章多的不可胜数,有人把“沉浸式”叫做“沉浸式状态栏”,还有人称作为“透明状态栏”、“变色状态...

  • Android 之低版本高版本实现沉浸式状态栏

    沉浸式状态栏确切的说应该叫做透明状态栏。一般情况下,状态栏的底色都为黑色,而沉浸式状态栏则是把状态栏设置为透明或者...

  • 2018-04-09工作日志,沉浸式状态栏PopupWindow

    1设置控件透明度 代码动态实现 xml布局实现 2沉浸式状态栏下显示PopupWindow 沉浸式状态栏显示Pop...

  • ionic1开发——APP体验优化之实现沉浸式状态栏

    什么是沉浸式状态栏 说得通俗一点,沉浸式状态栏也就是透明的状态栏(电池栏),同时也会显示状态栏上的内容,比如电量,...

  • Android系统实现沉浸式风格界面效果

    给系统状态栏设置全屏属性标志,再将状态栏背景颜色设为透明色,达到实现沉浸式效果 最标准的沉浸式界面风格的写法:

  • 状态栏

    一、沉浸式状态栏(没有状态栏了) 二、半透明状态栏 三、白色状态栏,修改状态栏颜色 调用

  • 沉浸式、MVP、MVVM

    1.沉浸式状态栏 获取状态栏的高度,然后把toolbar的高度加上状态栏的高度,再设置状态栏透明设置状态栏透明: ...

网友评论

    本文标题:沉浸式,透明式,可变状态栏解读

    本文链接:https://www.haomeiwen.com/subject/koymtxtx.html