沉浸式状态栏是android 4.4开始支持的一个feature,在软件打开的时候通知栏和软件顶部颜色融为一体,这样不仅可以使软件和系统本身更加融为一体,而且让用户注意力更加集中在内容上。
在ios上这是一个很早就支持的功能,但在android上则一直只能看到黑色的状态栏。google mail在抽屉上成功展示了沉浸式状态栏,可见想要把内容显示在状态栏肯定是能做的。
虽然google官方文档和网上那些技术文章中,都轻描淡写地用
1
|
< item name = "android:windowTranslucentStatus" >true</ item > |
或者
1
2
3
4
5
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = getWindow(); window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } |
但设置后,则会把状态栏当做应用可用区域的一部分,而导致应用标题栏的图标/文字显示到状态栏上,和原有时间等区域重合。而设置android:fitsSystemWindows=”true”则只是把整个window的背景色延展到了状态栏,实则是伪沉浸式。
所以这里要做的是如何在做好沉浸式的同时不让状态栏本身内容被影响。
很多rom把渐变阴影给去了(CM、miui、Flyme OS等等)
大部分应用了沉浸式状态栏的应用都没有考虑到这点,如腾讯地图,导致在那些rom上打开应用后状态栏一片白乎乎的看不清。
尽管google的原生4.4 rom中,在设置了沉浸式状态栏后,会对状态栏区域加上一条渐变的背景,来防止亮色导致状态栏图标/字看不清,但实际应用中发现其实很多rom把渐变阴影给去了,所以在状态栏组件中,加上了绘制阴影的选项(包括5.0半透明黑条和4.4渐变阴影两种选项),会在4.4机器开启了沉浸式状态栏时,绘制阴影。
状态栏高度不一致
部分rom(如miui和Flyme等)修改了状态栏高度,miui改高了,而meizu上的flyme则改矮了,所以不能直接写作25dp。在CustomTitleBar组件中通过重写getPaddingTop方法来兼容所有状态栏高度。
插件和没有标题栏的activity
插件和一些没有标题栏的activity的layout都因为沉浸式状态栏而乱了。如果不需要标题栏的话,可以直接通过在layout root上加上android:fitsSystemWindows=”true”来自适应,否则同样需要做重写style样式(因为目前插件还不能直接引用主工程资源)
既知的页面resize bug
一个已知的在设置沉浸式状态栏后的bug:https://code.google.com/p/android/issues/detail?id=63777。导致在软键盘弹出后页面没有resize,内容被键盘遮住,adjustPan不起作用,如写说说、写日志这些界面。直接在需要relayout的子view上添加fitsSystemWindows属性。
01
02
03
04
05
06
07
08
09
10
11
12
|
public void setStatusBarDarkMode( boolean darkmode, Activity activity) { Class<!--? extends Window--> clazz = activity.getWindow().getClass(); try { Class<!--?--> layoutParams = Class.forName( "android.view.MiuiWindowManager$LayoutParams" ); Field field = layoutParams.getField( "EXTRA_FLAG_STATUS_BAR_DARK_MODE" ); int darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod( "setExtraFlags" , int . class , int . class ); extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0 , darkModeFlag); } catch (Exception e) { e.printStackTrace(); } } |
热门源码