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

http://www.jianshu.com/p/ce96368df089?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq

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

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

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

半透明状态栏

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

bantouming.png
bantouming.png

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

zhezhao.png
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没给你方法,唉。



作者:耍酷的宇
链接:http://www.jianshu.com/p/ce96368df089
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值