沉浸式ui因其更好的界面一致性,在Android应用,特别是google的原生app中得到了广泛的应用,随着Android版本的迭代,在6.0版本后仅需要几个简单的设置就可以实现效果很好的沉浸式体验。
总述
Android app默认界面包含如下几部分:![](https://img.haomeiwen.com/i8678702/6de8a98ba4a16b40.png)
1)顶部用于显示时间等信息的StatusBar;
2)StatusBar下方通常有Toolbar(在较早的Android版本中为Actionbar);
3)对于无实体按键的机型,界面底部还有包含虚拟操作按键的NavigationBar。
针对上述三个模块的布局及衔接,即是打造沉浸式ui的关键:
1)隐藏NavigationBar;
2)app主界面(通常为Toolbar)布局向上延伸到屏幕顶端;
3)StatusBar隐藏或者显示为和app主界面(或者Toolbar)一致的风格。
ui界面风格的主要依赖app的theme style,以及对界面布局view的设置实现。
theme style设置主要参数说明
在res/values/styles.xml下新建自定义的app主题,作为整个app的主题,相关参数及说明如下。
<style name="CurrentAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<!--<item name="android:windowTranslucentStatus">true</item>-->
<!--<item name="android:windowTranslucentNavigation">true</item>-->
<item name="android:statusBarColor">@color/colorTrans</item>
<item name="android:navigationBarColor">@color/colorTrans</item>
1)这里采用的Theme继承自Theme.AppCompat.Light.NoActionBar,该主题不包含默认的顶部动作条(即Toolbar)。
这里需要注意,使用该Theme时
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
是必须要设置的两个参数,否则运行时即会触发无法找到ActionBar的错误。
2)注释掉的部分
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
是Android 4.4(API 19)加入的新风格属性,其用途是将对应的NavigationBar和StatusBar设置为透明色,实现的效果在Android4.4和Android5.5之后的版本上略有不同,如下所示。
![](https://img.haomeiwen.com/i8678702/2e85da18c58d6dd7.jpg)
该属性设置虽然在当时专为沉浸式ui服务,statusbar有特殊的底色以区分周围的布局;Navigationbar遮蔽了部分的布局,对界面的显示和实际的操作都有影响。
3)为避免上述问题,Android5.0(API 21)后加入了如下两个属性
<item name="android:statusBarColor">@color/colorTrans</item>
<item name="android:navigationBarColor">@color/colorTrans</item>
将statusbar和navigationbar的风格设置开放,开发者就可以自由的设置这两个区域的颜色了。如果希望实现和主布局统一的风格,仅需要将颜色设置为透明即可。
Activity动态设置实现全屏显示的布局
在Activity的onCreate中可通过getWindow().getDecoView()获取整个布局的视图,进而通过setSystemUiVisibility为布局视图设置标签实现想要的显示风格。
int setup = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
getWindow().getDecorView().setSystemUiVisibility(setup);
有更多参数可以方便实现不同需求的沉浸式风格:
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
SYSTEM_UI_FLAG_FULLSCREEN
这两个都是将当前布局全屏显示,不同的是,使用后者,则界面仅包含当前布局,而不再显示系统缺省的statusbar和navigationbar,这个的使用场景多为启动界面或者宣传界面;前者会将当前布局全屏显示,但是系统缺省的statusbar和navigationbar会以半透明色显示在当前布局上层。
SYSTEM_UI_FLAG_HIDE_NAVIGATION
隐藏navigationbar。仅包含此项设置时,对于界面的任何操作都会自动将navigationbar重新调出,且将hide的属性重置为无效。如果需要得到更稳定的navigationbar隐藏效果,就需要加入如下两个标签之一:
SYSTEM_UI_FLAG_IMMERSIVE
SYSTEM_UI_FLAG_IMMERSIVE_STICKY
这两个标签会较长久的隐藏navigationbar,但并非永久隐藏。其中使用前者时,在操作顶部或者底部系统菜单时,navigationbar也会被重新召回。
SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
Android6.0(API23)时加入的新属性,其作用是改变statusbar中信息的显示颜色。在之前的版本中statusbar的显示颜色是系统默认的(白色),并不会根据当前布局的颜色修改,导致在浅色的顶部布局下,statusbar信息难以辨认。加入该属性后,statusbar的信息显示颜色会使用黑色。
布局view被StatusBar遮蔽的处理
单独使用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN时,view和statusbar的显示效果如下:![](https://img.haomeiwen.com/i8678702/df0241e64396e6a4.png)
图中Toolbar布局部分被Statusbar遮盖,导致布局有些混乱,这时候需要在Toolbar的布局文件中加入
android:fitsSystemWindows="true"
布局会相应转变为
![](https://img.haomeiwen.com/i8678702/a45fa1fca4319162.png)
Toolbar和StatusBar之间显示了正确的位置关系。该属性在实际使用时需要注意,该属性的实际效果即在View布局的顶部加入一个padding,padding的尺寸根据statusbar自动计算,如果该属性作用于一个viewgroup,如各种形式的layout,需要对viewgroup中的view设置相应的padding bottom,并设置viewgroup的
android:layout_height="wrap_content"
否则加入的padding top会使所有的子view都往下便宜,挤压布局空间。
实现沉浸式UI的过程中踩了不少坑,更多更详细的操作说明可跳转至https://www.jianshu.com/p/f02abf30fc82查看。
网友评论