背景
状态栏属于SystemUI的管理范畴,虽然app界面的UI会受到SystemUI的影响,但是app并没有权限去直接绘制SystemUI的权限.所以还是需要通过更改一些SystemUI暴露出来的方法进行属性的修改,然后最终操纵的还是自己的View,来达到预期的效果
结构
StatusBarWindowView.java
1 | <!-- StatusBar的最外层--> |
PhoneStatusBarView.java
1 | <!--对应 /status_bar,是StatusBar的核心功能展示部分--> |
PhoneStatusBar
1 | //as a View Controller |
沉浸式属性
android:windowTranslucentStatus
- 目的:设置SystemUI中的statusBar的背景色为透明
- ApiLevel: Android 4.4/ApiLevel 19
android:windowTranslucentNavigation
- 目的:设置SystemUI中的Navigation背景为透明
- ApiLevel:Android 4.4/ApiLevel 19
android:statusBarColor
- 目的:暴露接口设置statueBar的颜色
- ApiLevel:Android 5.x/ApiLevel 21
android:fitsSystemWindows=”true”
- 目的:和systemUI和谐共处,所以不会占用systemUI空间,用上下左右的padding值进行填充,以保持和SystemUi和谐共处.
android:clipToPadding=”true”
- 目的:和padding值交集的部分是否采用clip的显示方式
显示流程
时序图
通过Zygote启动SystemServer最终启动SystemUIServer
相关代码
BaseStatusBar.start()
1 | /** |
开源框架(SystemBarTint)
一个工具式的开源框架
initBar
1 | /** |
SystemBarConfig
Class which describes system bar sizing and other characteristics for the current device configuration
1 |
|
setupStatusBarView&&setStatusBarAlpha
1 | private void setupStatusBarView(Context context, ViewGroup decorViewGroup) { |
1 | /** |