手机上的应用与桌面应用在 UI 上有个最大的不同点,就是默认占据全屏。可是屏幕上又偏生有一些部件是全局性的,是由系统维护其内容以及样式和行为的,app 往往需要跟它们进行某种程度上的协商,来获得最佳的展示效果。
总的来说,这些部件可以分为三类:状态栏、导航栏、输入法。早从 Symbian 年代就是这样了。Android 虽然是后起之秀,但在这个部分的设计也是螺蛳壳里做道场,没比前辈们好到哪儿去。最初把区域是划定了,然后出于协调的目的,对 Activity 的属性增加了 fitSystemWindows
来表示(windowSoftInputMode
也可以算做此类之中);但是由于沉浸式的引入而导致需要处理各个系统部件的动态显隐,又带来了一拨问题,Android 的应对之法是扩展 setSystemUiVisibility
相关的能力。再往后,由于动画侵入到了系统中界面状态变化的各个方面,引入了 WindowInsets 这个东东(三太爷译作“窗口衬件”),像 setSystemUiVisibility
这种无法控制过渡过程中的视觉效果的 API 就只好沦落至要被淘汰的地步,继而要去处理 WindowInsetsAnimation
和 WindowInsetsAnimation.Callback
了。
对于 setSystemUiVisibility
时期,可以参考这两篇文章,《Android setSystemUiVisibility 详解》和《Android 透明状态栏——你要的只是几个方法》。