最近项目需求中需要对statusBar做透明穿透处理,刚开始没想太多,随着开发进行,发现坑位那绝对是满满的,主要就是要对不同的API进行适配,很难做到多平台的兼顾。
android的状态栏有三种不同状态,分别是:
- 沉浸式状态栏
- 透明状态栏(又可分为“半透明”和“全透明”)(API>=19)
- 变色状态栏(API>=21)
沉浸式状态栏指的是,状态栏隐藏,在手指做了相关操作后,状态栏显示出来,例如视频播放器,在播放视频时是隐藏状态栏的,但是点击屏幕的时候,状态栏会显示出来,再例如文本阅读器,在阅读的时候是全屏的,然后从屏幕上方下滑或者下方上划,虚拟键和状态栏出现了,但却是直接覆盖在程序文字上的,这是所谓的沉浸式状态栏,而我们经常把沉浸和透明混为一谈,其实是有本质区别的。
半透明状态栏
Android4.4(API 19)以后才开始支持Android:windowTranslucentStatus属性,需要注意的是,TranslucentStatus属性虽然是从4.4开始支持的,但在 4.4 和 5.x 上的表现不同,不过都可以概括为一种半透明,4.4 是一层渐变的遮罩层,样子是这样的:
而5.x 以上是一条半透明的遮罩层,样子是这样的:
可以看到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没给你方法,唉。
在实际开发中,我们要做不同的适配,针对不同的sdk运用不同style,在4.4以下使用默认的,完全不做透明处理;在4.4 和5.0之间做成半透明;5.0以上其实已经可以做成全透明了,但是会有状态栏文字颜色不能修改,因为6.0以后才能修改状态栏的文字颜色,这时候很容易导致状态栏的文字颜色和下面的颜色重叠,对于这种情况通常下可做成百分之五十的透明色,当然这个要根据实际情况处理,如果不会出现重叠或者无关紧要,可直接做成全透明;对于6.0以上的就完全可以全透明了